問題
Microsoft.mshtml Primary Interop Assembly を参照している WPF アプリケーションがあります。NGen を使用してアプリのネイティブ イメージを作成しています。アプリを起動すると、ネイティブ イメージが読み込まれないのではないかと心配しています。
複製情報
たとえば、Visual Studio で新しい WPF アプリケーション "WpfApplication1" を作成し、"C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll" への参照を追加し、Embed Interop Types を false に設定し、特定のバージョンを設定します。 false に設定し、Copy Local を true に設定します。mshtml.HTMLDocumentClass のインスタンス化など、何らかの種類の Microsoft.mshtml を使用します。アプリをビルドしたら、次のように "c:\Windows\Microsoft.NET\Framework\v4.0.30319" から NGen を実行します。
ngen install "%PATHTOMYAPPDIR%\WPFApplication1.exe" /NoDependencies
NGen はエラーを表示しません。アプリを起動した後、vmmap またはプロセス エクスプローラーを使用して、ネイティブ イメージが読み込まれたかどうかを確認しています。残念ながら、作成されたネイティブ イメージを表示しているものはありません。
融合ログ
Fusion ログ ビューアを有効にすると、次のように表示されます。
* アセンブリ バインダー ログ エントリ (2016 年 3 月 13 日 @ 11:30:48 AM) *
操作は成功しました。バインド結果: 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
--- 詳細なエラー ログが続きます。ログ: すべての依存関係の検証を開始します。
ログ: [レベル 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、Version=4.0.0.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35 の検証を開始します。
ログ: [レベル 1] ネイティブ イメージ依存システムの検証を開始します。バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089。
ログ: [レベル 2] ネイティブ イメージの依存関係 mscorlib、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089 の検証を開始します。
ログ: [レベル 2] IL 依存 System.Configuration、Version=4.0.0.0、Culture=neutral、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 アセンブリを読み込めません。(時間 = 0x80131040)。
WRN: 一致するネイティブ イメージが見つかりません。
ログ: C:\Users\azureuser\Documents\visual studio 2015\Projects\WpfApplication1\WpfApplication1\bin\Release\WpfApplication1.exe から読み込まれた IL アセンブリ。
備考
- mshtml コードを含む Microsoft.mshtml 参照を削除すると、期待どおりにネイティブ イメージが読み込まれます。したがって、一般的に、私のシステムではngeningが機能します。
- Windows 7 Ultimate、Windows Server 2012 Datacenter、および Windows 10 の 3 つの異なる OS でこの動作をテストしましたが、同じ結果が得られました。
- 実行して負荷検証を無効にして
sn.exe -Vr *,*
も、動作は変わりません - 実際に GAC から読み込まれる Microsoft.mshtml は、「C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies」にあるものとは若干異なる (証明書が異なる) ため、こちらも直接参照してみました。 GACは異なる結果を生成しません
- 「C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies」の下にあるものを実行してGACに入れて
gacutil -if
も機能しません - このアプリは、.net 4.5 をターゲットとする VS2013 と .net 4.6 をターゲットとする VS2015 を使用して構築しました。