3

我在 Windows 7 中使用 IE11。然后我在 C# 项目c:\Windows\System32\mshtml.tld中添加了一个引用并尝试获取 mshtml.IHTMLDocument6 或 mshtml.IHTMLDocument7,但 VS2013 没有看到它。我只能得到 mshtml.IHTMLDocument、mshtml.IHTMLDocument2 .. mshtml.IHTMLDocument5。

IHTMLDocument7 界面 https://msdn.microsoft.com/ru-ru/library/windows/hardware/ff975572

4

1 回答 1

10

选择 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 旧,它将为空。

于 2016-07-26T11:15:38.193 回答