Определите, используются ли сборки GAC и NGen

Как определить, используются ли собственные образы без проверки загрузчиком проверки подписи сборки во время выполнения или даже с использованием сборки GAC?

У меня сложная система, с которой мы экспериментируем с NGen, но в настоящее время мы запускаем exe из папки, в которой находятся все библиотеки DLL, из-за большого количества зависимостей позднего связывания, глядя на Process Explorer, похоже, что Native images используется, но как я могу быть уверен, что получаю полную выгоду и устраняю шаг проверки загрузчика?

Ура, Грэм.

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

LOG: [Level 1]Start validating IL dependency MyCompany.Entities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd.
LOG: Dependency evaluation succeeded.

и в конце

LOG: Validation of dependencies succeeded.
LOG: Start loading all the dependencies into load context.
LOG: Loading of dependencies succeeded.
LOG: Bind to native image succeeded.
Native image has correct version information.
Attempting to use native image C:\Windows\assembly\NativeImages_v2.0.50727_32\MyCompany.Mylibrary#\4710bb8309419d707681bd360088181f\MyCompany.MyLibrary.MyClass.ni.dll.
ZAP: Native image has been relocated.
Native image successfully used.

Таким образом, он использует собственные изображения, но все еще проверяет их, то есть не использует версию GAC, хотя именно там я и создал исходное изображение, например:

ngen install "MyCompany.Entites, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd, processorArchitecture=MSIL"

Сноска. Эта статья, по-видимому, подразумевает, что, если сборки не загружаются из GAC, тогда процесс проверки сведет на нет преимущества NGen? CLR Inside Out - повышение производительности запуска приложений (MSDN)

Обновление - как Nobugz указал в комментарии ниже, упомянутый выше шаг проверки не выполняется, начиная с 3.5 SP1, см. Документы MSDN на NGen

3 ответа

Решение

Вы можете легко увидеть это из инструмента Fuslogvw.exe. Запустите его из командной строки Visual Studio. Сконфигурируйте его с помощью параметра "Категории журналов" = "Собственные изображения", "Настройки" + "Журнал". Запустите вашу программу. Вернуться к fuslogvw, Обновить. Он покажет вам список всех сборок, которые были загружены.

Дважды щелкните запись, чтобы увидеть, как загружена сборка. Если он пришел из GAC, вы увидите:

LOG: сборка IL, загруженная из C:\Windows\assembly\GAC_MSIL\blahblah

Если использовались изображения Ngen-ed, вы увидите:

LOG: привязка к исходному изображению успешно завершена.

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

Assembly assembly = Assembly.GetExecutingAssembly();

if (assembly.GlobalAssemblyCache)
{
    Console.WriteLine("I'm in the GAC!");
}

РЕДАКТИРОВАТЬ: нашел способ...

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

Вы можете использовать VMMAP. Там все.dll (сборка) имеют данные о местоположении

Подробно, если ваша сборка загружается из "C:\Windows\assembly\NativeImages(version)...", значит ваше приложение использует собственный образ.

Другие вопросы по тегам