Вопрос об отражении.NET

Следующий код (упакованный в проекте Visual Studio 'Консольного приложения'):

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace TestReflection
{
    class Program
    {
        static void Main(string[] args)
        {
            bool found = false;
            foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                if (assembly.GetType("System.Diagnostics.Process") != null)
                {
                    found = true;
                    break;
                }
            }
            Console.WriteLine(found);
            Console.ReadKey();
        }
    }
}

печать, 'Верная' при выполнении его в режиме отладки (F5), но 'Лжи' при запуске его без отладчика (Ctrl-F5). Другие классы показывают подобное поведение (System.Text.RegularExpressions.Regex), другие найдены в обоих случаях (System.IO.File).

Я, вероятно, пропускаю что-то очевидное - почему это происходит?

(то же самое происходит в обеих Visual Studio 2005 и 2008).

ОБНОВЛЕНИЕ

Список блоков нашел:

Режим отладки:

mscorlib
TestReflection
System
Microsoft.VisualStudio.HostingProcess.Utilities
System.Windows.Forms

Режим выполнения:

mscorlib
TestReflection

Поскольку ответы подразумевают в режиме выполнения, который Системный блок пропускает (не загруженный). Моя проблема состояла в том, что я предполагал, что GetAssemblies () также возвращал не загруженные блоки.

В то время как это объясняет поведение для System.Diagnostics.Process, почему мой код находит System.IO.File и в режимах выполнения и в режимах отладки?

Спасибо!

ОБНОВЛЕНИЕ 2

Я изменил код для цикличного выполнения посредством загруженных блоков и текущего блока, собрав список блоков, на которые они ссылаются. Если после итерации загруженных блоков я не могу найти тип, я ищу, я начинаю загружать и осматривать блоки, на которые ссылаются.

Кажется этим, даже если у меня есть ссылка на System.dll в моем проекте (я смотрю на свойства 'Системной' ссылки в Visual Studio), мой исполняемый файл только ссылки mscorlib.dll (согласно Отражателю).

Как я добавляю 'реальную' ссылку на System.dll? Размещение фиктивной строки

new System.Diagnostics.ProcessStartInfo();

в начале Main добивается цели (вещи работа как ожидалось, Отражатель показывает ссылки для обоих mscorlib.dll и System.dll при осмотре исполняемого файла), но это - взлом.

Еще раз спасибо!

6
задан Miron Brezuleanu 26 January 2010 в 12:49
поделиться

5 ответов

appdomain.getassemblies не возвращает все узлы, на которые у вас есть , скорее он возвращает все узлы, которые в настоящее время загружены в Appdomain.

Очевидно, что класс Diagnostics.Process не используется непосредственно вашим приложением и, таким образом, не будет загружен при запуске за пределы отладчика.

Так почему мы находим System.io.file, но не System.diagnostics.process? Причина в том, что два класса, хотя они проживают в одном и том же системе пространства пространства имен верхнего уровня, фактически живут в двух разных собраниях. Это легко видно, если вы посмотрите на два класса в браузере Visual Studio Object. Класс файла происходит, чтобы жить в MSCorlib DLL, в то время как класс процесса живет в системе DLL.

Поскольку приложение NO .NET не может работать без MScorlib, которое будет загружено, пока System.dll не загружен, поскольку вы не ссылаетесь на какие-либо типы, которые живут в этой DLL.

11
ответ дан 8 December 2019 в 16:02
поделиться

Отладчик в VS делает все возможное, чтобы обмануть и обмануть вас, думая, что вы запускаете свое приложение, так как он будет на производстве. Тем не менее, это делает целую кучу вещей, которые вы не ожидаете, такие как с нетерпением загрузки сборки, сохраняя варс в длину после того, как они обычно были собраны и т. Д.

в сборке высвобождения, CLR не будет загружаться Собрание в Appdomain до тех пор, пока не требуется тип или экземпляр типа типа. Это поведение не гарантируется в отладке времени.

Если ваш код чувствителен к этим изменениям, я бы предложил отремонтировать его или проверять System.diagnostics.debugger.isatched.

4
ответ дан 8 December 2019 в 16:02
поделиться

Я представляю, что некоторые сборки не находятся непосредственно привязаны к вашему проекту, но при отлажении сопоставляются в ваш процесс самого отладчика.

Убедитесь, что сборки, которые вы ищете в ссылок для вашего проекта.

0
ответ дан 8 December 2019 в 16:02
поделиться

Возможно, вам может быть интересно попробовать эту строку с помощью и без отладчика прилагается:

Console.WriteLine(Process.GetCurrentProcess().ProcessName);

в короткие сроки как @Will Notes , когда вы работаете изнутри VS с Прикрепленный отладчик, вы на самом деле не работаете «Ваше exe» вообще, а скорее целые рамки, которые отладчик VS устанавливает для вас. Вещи будут разными.

0
ответ дан 8 December 2019 в 16:02
поделиться

Нет, вы не можете отменить рендурирование из фильтра действия. Есть много причин, по которым вы не должны этого делать. Что бы увидим клиента? Страница ошибки? Ничего?

Я предполагаю, что вы создаете авторизованный фильтр действий, который сделает что-то еще, если вы не подписали. Есть один в рамках уже (авторизеатрибут), который перенаправляет вас на страницу входа в систему, если вы не подписаны. То, как они это делают в рамках, состоит в том, чтобы изменить результат, который выполняется (filtercontext.result = [[новый результат]];). Если вам не нравится, как это работает, вы можете создать собственную реализацию.

Если вам все еще нужно отменить рендеринг или что-то в этом роде, вам нужно будет создать свой собственный AcceptResult и выполнять любую логику, которая вам нужна в методе Execute.

- Обновление -

Если вы хотите использовать Render Action, вы должны просто поместить логику в контроллер и вернуть пустой результат, если вы не подписаны (есть результат действий, называемый «WellyResult» в рамках ). Такая логика принадлежит к действию контроллера.

-121--3853812-

Обычно сборки не загружаются до необходимости. При работе в режиме отладки отладчик загружает сборку Microsoft.visualStudio.hostingProcess.В. Я предполагаю, что эта сборка вызовов в монтажу системы и, следовательно, система нагрузки загружена при запуске в режиме отладки.

0
ответ дан 8 December 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: