Невозможно загрузить собственный образ Microsoft.mshtml, ссылающийся на сборку IL

Проблема

У меня есть приложение 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.

person theoneandonlyiefanboy    schedule 13.03.2016    source источник
comment
Microsoft.mshtml.dll — это устаревшая сборка, предназначенная для .NET 1.0, версии .NET, в которой еще не было NGen. Довольно неясно, что может произойти, я не хочу испортить свою машину. Вам нужно будет сообщить Fuslogvw, чтобы он регистрировал привязки собственного изображения, чтобы увидеть больше, нижняя кнопка. Вы не должны не этого делать, встроенные типы взаимодействия всегда лучше, чем зависимость PIA. Установите его обратно в True, чтобы тривиально решить вашу проблему.   -  person Hans Passant    schedule 13.03.2016
comment
Спасибо за ваш ответ. Установка для Embed Interop Types значения true в моем случае не подходит. Если я это сделаю, VS скажет мне: тип взаимодействия «mshtml.HTMLDocumentClass» не может быть встроен. Вместо этого используйте соответствующий интерфейс. Журнал слияния, который вы видите в моем посте, уже относится к родной категории.   -  person theoneandonlyiefanboy    schedule 13.03.2016
comment
Конечно, очень тривиально исправить. Просто следуйте указаниям, которые дает вам сообщение об ошибке, и вместо этого используйте интерфейс. Удалите класс из имени идентификатора, и он будет работать нормально. Также избегает очень неприятного режима сбоя, два удара за один доллар.   -  person Hans Passant    schedule 13.03.2016
comment
Ну, спасибо на некоторое время. Действительно, если я использую в своем Testapp только интерфейсы/перечисления Microsoft.mshtml, все работает нормально. Но, как вы понимаете, я делаю это не для развлечения. Так что я должен оценить, нужно ли настоящему приложению, с которым я имею дело, что-то еще от Microsoft.mshtml.dll.   -  person theoneandonlyiefanboy    schedule 13.03.2016
comment
Просто делайте это правильно, и у вас автоматически появится больше времени на развлечения. Больше нет, идентификаторы XxxClass были ошибкой дизайна. Хотя намерение было хорошим, программисты C# не любят использовать ключевое слово new в типах интерфейсов.   -  person Hans Passant    schedule 13.03.2016
comment
Мы используем типы класса только для сравнения типов (например, obj.GetType() == mshtml.HTMLTableCellClass). Если я сейчас использую интерфейс и возьму конструкцию С# is (например, obj — это mshtml.HTMLTableCell), это, к сожалению, возвращает true даже для объектов HTMLBodyClass. Возможный обходной путь для меня, похоже, соответствует строке obj.GetType().FullName. Но мне это кажется немного странным. Есть ли у вас какие-либо другие предложения для этой ситуации?   -  person theoneandonlyiefanboy    schedule 14.03.2016
comment
Не сразу, конечно, лучше задать вопрос об этом и показать нам, что именно вы делаете.   -  person Hans Passant    schedule 14.03.2016