Следующий код (упакован в проект 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();
}
}
}
печатает «True» при запуске в режиме отладки (F5), но «False» при запуске без отладчика (Ctrl-F5). Другие классы показывают похожее поведение (System.Text.RegularExpressions.Regex
), другие встречаются в обоих случаях (System.IO.File
).
Я, вероятно, упускаю что-то очевидное - почему это происходит?
(то же самое происходит в Visual Studio 2005 и 2008).
UPDATE
Список найденных сборок:
Режим отладки:
mscorlib
TestReflection
System
Microsoft.VisualStudio.HostingProcess.Utilities
System.Windows.Forms
Режим работы:
mscorlib
TestReflection
Как следует из ответов, в режиме запуска сборка системы отсутствует (не загружена). Моя проблема заключалась в том, что я предполагал, что GetAssemblies () также возвращает не загруженные сборки.
Хотя это объясняет поведение System.Diagnostics.Process
, почему мой код находит System.IO.File
в режиме запуска и отладки?
Спасибо!
ОБНОВЛЕНИЕ 2
Я изменил код для циклического просмотра загруженных сборок и текущей сборки, собирая список сборок, на которые они ссылаются. Если после итерации загруженных сборок я не могу найти искомый тип, я начинаю загружать и проверять ссылочные сборки.
Кажется, что даже если у меня есть ссылка на System.dll
в моем проекте (я просматриваю свойства ссылки 'System' в Visual Studio), мой исполняемый файл ссылается только на mscorlib.dll
(согласно Reflector ).
Как добавить «реальную» ссылку на System.dll
? Размещение фиктивной линии
new System.Diagnostics.ProcessStartInfo();
в начале Main
делает свое дело (все работает как положено, Reflector показывает ссылки как для mscorlib.dll
, так и System.dll
при проверке исполняемого файла), но это взлом.
Еще раз спасибо!