问题
我有一个引用 Microsoft.mshtml 主互操作程序集的 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。使用某种类型的 Microsoft.mshtml,例如实例化 mshtml.HTMLDocumentClass。构建应用程序后,从“c:\Windows\Microsoft.NET\Framework\v4.0.30319”运行 NGen,如下所示:
ngen install "%PATHTOMYAPPDIR%\WPFApplication1.exe" /NoDependencies
NGen 没有显示任何错误。启动我的应用程序后,我正在使用 vmmap 或进程资源管理器验证是否已加载本机映像。不幸的是,它们都没有显示创建的本机图像。
融合日志
所以我启用了融合日志查看器,这就是它告诉我的:
*组装活页夹日志条目(3/13/2016 @ 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
--- 详细的错误日志如下。LOG:开始验证所有依赖项。
LOG:[Level 1]开始验证原生镜像依赖 mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。
LOG:[Level 1]开始验证IL依赖PresentationFramework,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35。
LOG:[Level 1]开始验证 IL 依赖 WindowsBase,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35。
日志:[Level 1]开始验证 IL 依赖 System.Xaml,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。
LOG:[Level 1]开始验证 IL 依赖 PresentationCore,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35。
LOG:[Level 1]开始验证原生镜像依赖系统,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。
LOG:[Level 2]开始验证原生镜像依赖 mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。
LOG:[Level 2]开始验证 IL 依赖 System.Configuration,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a。
LOG:[Level 2]开始验证 IL 依赖 System.Xml,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。
本机映像具有正确的版本信息。
LOG:[Level 1]开始验证 IL 依赖 UIAutomationTypes,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35。
日志:[级别 1]开始验证 IL 依赖项 Microsoft.mshtml,版本=7.0.3300.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a。
警告:无法加载 IL 程序集。(小时 = 0x80131040)。
警告:未找到匹配的本机图像。
日志:从 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。
- 通过运行禁用负载验证
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 构建了这个应用程序