Следующий код (упакованный в проекте 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
и в режимах выполнения и в режимах отладки?
Спасибо!
Я изменил код для цикличного выполнения посредством загруженных блоков и текущего блока, собрав список блоков, на которые они ссылаются. Если после итерации загруженных блоков я не могу найти тип, я ищу, я начинаю загружать и осматривать блоки, на которые ссылаются.
Кажется этим, даже если у меня есть ссылка на System.dll
в моем проекте (я смотрю на свойства 'Системной' ссылки в Visual Studio), мой исполняемый файл только ссылки mscorlib.dll
(согласно Отражателю).
Как я добавляю 'реальную' ссылку на System.dll
? Размещение фиктивной строки
new System.Diagnostics.ProcessStartInfo();
в начале Main
добивается цели (вещи работа как ожидалось, Отражатель показывает ссылки для обоих mscorlib.dll
и System.dll
при осмотре исполняемого файла), но это - взлом.
Еще раз спасибо!
appdomain.getassemblies не возвращает все узлы, на которые у вас есть , скорее он возвращает все узлы, которые в настоящее время загружены в Appdomain.
Очевидно, что класс Diagnostics.Process не используется непосредственно вашим приложением и, таким образом, не будет загружен при запуске за пределы отладчика.
Так почему мы находим System.io.file, но не System.diagnostics.process? Причина в том, что два класса, хотя они проживают в одном и том же системе пространства пространства имен верхнего уровня, фактически живут в двух разных собраниях. Это легко видно, если вы посмотрите на два класса в браузере Visual Studio Object. Класс файла происходит, чтобы жить в MSCorlib DLL, в то время как класс процесса живет в системе DLL.
Поскольку приложение NO .NET не может работать без MScorlib, которое будет загружено, пока System.dll не загружен, поскольку вы не ссылаетесь на какие-либо типы, которые живут в этой DLL.
Отладчик в VS делает все возможное, чтобы обмануть и обмануть вас, думая, что вы запускаете свое приложение, так как он будет на производстве. Тем не менее, это делает целую кучу вещей, которые вы не ожидаете, такие как с нетерпением загрузки сборки, сохраняя варс в длину после того, как они обычно были собраны и т. Д.
в сборке высвобождения, CLR не будет загружаться Собрание в Appdomain до тех пор, пока не требуется тип или экземпляр типа типа. Это поведение не гарантируется в отладке времени.
Если ваш код чувствителен к этим изменениям, я бы предложил отремонтировать его или проверять System.diagnostics.debugger.isatched.
Я представляю, что некоторые сборки не находятся непосредственно привязаны к вашему проекту, но при отлажении сопоставляются в ваш процесс самого отладчика.
Убедитесь, что сборки, которые вы ищете в ссылок
для вашего проекта.
Возможно, вам может быть интересно попробовать эту строку с помощью и без отладчика прилагается:
Console.WriteLine(Process.GetCurrentProcess().ProcessName);
в короткие сроки как @Will Notes , когда вы работаете изнутри VS с Прикрепленный отладчик, вы на самом деле не работаете «Ваше exe» вообще, а скорее целые рамки, которые отладчик VS устанавливает для вас. Вещи будут разными.
Нет, вы не можете отменить рендурирование из фильтра действия. Есть много причин, по которым вы не должны этого делать. Что бы увидим клиента? Страница ошибки? Ничего?
Я предполагаю, что вы создаете авторизованный фильтр действий, который сделает что-то еще, если вы не подписали. Есть один в рамках уже (авторизеатрибут), который перенаправляет вас на страницу входа в систему, если вы не подписаны. То, как они это делают в рамках, состоит в том, чтобы изменить результат, который выполняется (filtercontext.result = [[новый результат]];). Если вам не нравится, как это работает, вы можете создать собственную реализацию.
Если вам все еще нужно отменить рендеринг или что-то в этом роде, вам нужно будет создать свой собственный AcceptResult и выполнять любую логику, которая вам нужна в методе Execute.
- Обновление -
Если вы хотите использовать Render Action, вы должны просто поместить логику в контроллер и вернуть пустой результат, если вы не подписаны (есть результат действий, называемый «WellyResult» в рамках ). Такая логика принадлежит к действию контроллера.
-121--3853812-Обычно сборки не загружаются до необходимости. При работе в режиме отладки отладчик загружает сборку Microsoft.visualStudio.hostingProcess.В. Я предполагаю, что эта сборка вызовов в монтажу системы и, следовательно, система нагрузки загружена при запуске в режиме отладки.