Проблема
У меня есть приложение WPF, которое ссылается на основную сборку взаимодействия Microsoft.mshtml. Я создаю собственный образ своего приложения с помощью NGen. Я боюсь, что собственное изображение никогда не загружается, если я запускаю свое приложение.
Информация о воспроизведении
Например. создайте новое приложение WPF «WpfApplication1» в Visual Studio, добавьте ссылку на «C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll», установите для Embed Interop Types значение false, установите для параметра Specific Version значение false и установите для параметра Copy Local значение true. Используйте некоторый тип Microsoft.mshtml, например создание экземпляра mshtml.HTMLDocumentClass. После создания приложения запустите NGen из «c:\Windows\Microsoft.NET\Framework\v4.0.30319» следующим образом:
ngen install "%PATHTOMYAPPDIR%\WPFApplication1.exe" /NoDependencies
NGen ошибок не показывает. После запуска моего приложения я проверяю, загружено ли собственное изображение с помощью vmmap или проводника процессов. К сожалению, ни один из них не показывает созданный собственный образ.
Журнал слияния
Итак, я включил средство просмотра журнала Fusion, и вот что оно мне сообщает:
* Запись в журнале связывателя сборки (13 марта 2016 г., 11:30:48) *
Операция прошла успешно. Результат привязки: hr = 0x0. Операция завершилась успешно.
Диспетчер сборок загружается из: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll Работает под исполняемым файлом C:\Users\azureuser\Documents\visual studio 2015\Projects\WpfApplication1\WpfApplication1\bin\Release\WpfApplication1 .exe
--- Далее следует подробный журнал ошибок.LOG: Начать проверку всех зависимостей.
ЖУРНАЛ: [Уровень 1] Начать проверку зависимости собственного образа mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089.
ЖУРНАЛ: [Уровень 1] Начать проверку зависимости IL PresentationFramework, версия = 4.0.0.0 , культура = нейтральная, PublicKeyToken = 31bf3856ad364e35.
ЖУРНАЛ: [Уровень 1] Начать проверку зависимости IL WindowsBase, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35.
ЖУРНАЛ: [Уровень 1] Начать проверку IL зависимость System.Xaml, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089.
ЖУРНАЛ: [Уровень 1] Начать проверку зависимости IL PresentationCore, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35.
ЖУРНАЛ: [Уровень 1] Начать проверку зависимости собственного образа System, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089.
ЖУРНАЛ: [Уровень 2] Начать проверку зависимости собственного образа mscorlib, версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089.
ЖУРНАЛ: [Уровень 2] Начать проверку зависимости IL cy System.Configuration, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a.
ЖУРНАЛ: [Уровень 2] Начать проверку зависимости IL System.Xml, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089.
Собственный образ содержит правильную информацию о версии.
ЖУРНАЛ: [Уровень 1] Начать проверку зависимости IL UIAutomationTypes, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35.
ЖУРНАЛ: [Уровень 1] Начать проверку Зависимость IL Microsoft.mshtml, версия = 7.0.3300.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a.
WRN: не удается загрузить сборку IL. (hr = 0x80131040).
WRN: не найдено подходящего собственного образа.
LOG: сборка IL загружена из C:\Users\azureuser\Documents\visual studio 2015\Projects\WpfApplication1\WpfApplication1\bin\Release\WpfApplication1 .исполняемый.
Примечания
- Если я удалю ссылку на Microsoft.mshtml, включая код mshtml, собственное изображение будет загружено, как и ожидалось. Так что в целом гененинг работает на моих системах.
- Я протестировал это поведение на трех разных ОС и дал одинаковый результат: Windows 7 Ultimate, Windows Server 2012 Datacenter и Windows 10.
- Отключение проверки загрузки путем запуска
sn.exe -Vr *,*
не меняет поведение - Поскольку файл Microsoft.mshtml, который фактически загружается из GAC, немного отличается от файла в "C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies" (разные сертификаты), я также попытался напрямую сослаться на файл в GAC не дает другого результата
- Помещение одного из "C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies" в GAC путем запуска
gacutil -if
также не работает - Я создал это приложение, используя VS2013 для .net 4.5 и VS2015 для .net 4.6.