选择 MSHTML 程序集引用,查看它的 Path 属性,您会发现问题:
C:\WINDOWS\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll
这是 mshtml 类型库的 PIA,安装在任何安装了 VS 的程序员机器上。版本 7.0.3300 是来自 .NET 1.0 时代的版本号,已经有 14 年历史了。当然早于 IE11,这就是为什么它没有后来的接口类型。使用 PIA 绝不是错误的做法,它确保您的程序可以在任何版本的 IE 上运行,一直到 IE6。
但这不是您想要的,您必须从 IE11 类型库生成自己的互操作库。运行 Visual Studio 命令提示符,导航到您的项目目录并键入以下命令:
Tlbimp c:\windows\system32\mshtml.tlb /out:Interop.mshtml.dll
它会滚动很长一段时间,它是一个大的,并吐出几个关于存在 PIA 的警告以及一些不能从 .NET 程序直接使用的晦涩的方法和类型。你可以忽略它们,它们在 PIA 中也不起作用。
现在,您的项目目录中有 Interop.mshtml.dll 文件。回到 VS,删除旧的 MSHTML 引用并使用 Project > Add Reference > Browse 选择刚刚创建的新引用。默认情况下,它的“嵌入互操作类型”属性为 True,不再需要 PIA,并且您不必使用程序部署文件。将文件签入源代码管理,因此您只需执行一次。
请注意,当您的程序在没有安装所需版本的 IE 的机器上运行时,它可能会因 E_NOINTERFACE 异常而死掉。您可以使用as
运算符将文档引用转换为 IHtmlDocument7,如果 IE 旧,它将为空。