最新消息:VPS服务器又从fzhost.net换回Linode了,主题仍用朋友推荐的大前端D8

【已解决】两种版本mshtml:.NET中的Microsoft.mshtml的Microsoft.mshtml.dll和COM中的Microsoft HTML Object Library的mshtml.tlb之间的区别

C# crifan 2646浏览 0评论

【问题】

在64位win7下,一个C#项目中,代码里面引用了mshtml:

using mshtml;

然后去添加了.NET中的Microsoft.mshtml的Microsoft.mshtml.dll引用:

Microsoft.mshtml dll in .NET

reference Microsoft.mshtml

但是后来发现,此法编译出来的程序,放到另外一个64位的Win7下运行,结果出错:

未能加载文件或程序集“Microsoft.mshtml,Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b3f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。

但是另外一台XP下,却是可以正常运行的。

(错误详见:Win7中运行exe出错:应用程序中发生了无法处理的异常。未能加载文件或程序集 “Microsoft.mshtml,Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b3f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件

对于此问题,去找原因的时候,却发现,还有一个版本的mshtml:

Microsoft HTML Object Library

 

然后,刚刚,又发现还有一个版本的mshtml,是和mshtml.tlb同路径下的mshtml.dll:

mshtml.dll under system32

所以,现在就是共有三个版本的mshtml了:

  • .NET中的Microsoft.mshtml,对应文件是Microsoft.mshtml.dll,路径是c:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Common
  • COM中的Microsoft HTML Object Library,对应的文件是mshtml.tlb,路径是C:\Windows\System32
  • C:\Windows\System32下面的mshtml.dll,显示的版本号是9.00.8112.16450,看起来是属于IE的。估计是安装IE9而拷贝过来的。

 

所以现在就是要去搞懂这几个版本的mshtml的区别。

【解决过程】

1.看到官网的解释:

MSHTML Overviews

中说,对于MSHTML是自从IE4,就引入了。

2. 找到有人遇到类似疑问了:

911日记:Microsoft.mshtml.dll和 com MSHTML.tlb 的区别

参考其中提到的:

Microsoft.mshtml到底是什么?

倒是知道了,原来

c:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Common

中的PIA,就是Primary Interop Assembly的意思。

话说,最后看完解释,也还是没看懂其所说的区别是啥。

3.这里:

Where can I get the Microsoft.mshtml.dll (I’m a Visual Web Developer 2008 Express Ed. user)

也建议说让自己通过tlbimp.exe从mshtml.tlb生成一个Microsoft.mshtml.dll,感觉越来越晕了。

4.这里:

关于 VS2005 打包 Microsoft.mshtml 的解决方法

貌似解释清楚了,其解释说是:

因为 Microsoft.mshtmal.dll 这个 dll 是从 system32 文件夹下的 mshtml.tlb(COM 类型库文件)中导出的

所以,只需要我们通过:

tlbimp mshtml.tlb /out:mshtml.dll

去导出一个mshtml.dll即可。

但是很容易想到,既然Microsoft.mshtmal.dll来自mshtml.tlb,那么如果本身程序添加引用时,就添加mshtml.tlb而非Microsoft.mshtmal.dll,是不是就可以解决之前的问题了?

5.所以就去试试。然后添加了COM中的Microsoft HTML Object Library,即C:\Windows\System32\mshtml.tlb,添加后的引用列表中,就出现了MSHTML,而非之前的Microsoft.mshtml:

reference MSHTML

另外也去看了下MSHTML对象,在对象浏览器中显示的结果:

object browser same both is Microsoft.mshtml

可以看出,其是和之前的引用Microsoft.mshtml的结果一样的,都是Microsoft.mshtml。

这也基本验证了之前的那句“Microsoft.mshtmal.dll是从C:\Windows\System32\mshtml.tlb(COM 类型库文件)中导出的”,所以两者内容是一致的。

 

【总结】

C#的代码中引用了mshtml:

using mshtml;

后,去引用mshtml时,要选择:COM中的Microsoft HTML Object Library(对应的文件是C:\Windows\System32\mshtml.tlb

add COM mshtml.tlb

添加完mshtml.tlb的引用后,引用列表中的是MSHTML(而不是Microsoft.mshtml):

reference MSHTML

 

而不要选择:

.NET中的Microsoft.mshtml,对应文件是c:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Common\Microsoft.mshtml.dll

否则(可能会)导致,编译出来的程序,在当前(已安装了Microsoft Visual Studio的)电脑上运行没问题,但是在别的(没有安装Microsoft Visual Studio的)电脑上运行, (只装了.NET Framework也是没用的)程序运行会出错:

未能加载文件或程序集“Microsoft.mshtml,Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b3f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。

 

【后记】

后来发现,其实上述即使引用了mshtml.tlb,结果也还是引用的Microsoft.mshtml

same mshtml

而且程序放到别的XP中运行,还是会出现那个“未能加载文件或程序集 Microsoft.mshtml”的错误。

而最终的解决办法参见:

【已解决】Win7中运行exe出错:应用程序中发生了无法处理的异常。未能加载文件或程序集“Microsoft.mshtml,Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b3f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件

 

【总结2】

对于.NET中的Microsoft.mshtml.dll 和COM中的mshtml.tlb,其实本质是一样的。

因为两者之间的关系是,Microsoft.mshtml.dll是来自于mshtml.tlb的。是可以通过(VS命令下的工具)tlbimp从mshtml.tlb导出Microsoft.mshtml.dll的。

注:

想要让你的C#编译出来的程序,不会出现“未能加载文件或程序集 Microsoft.mshtml,Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b3f5f7f11d50a3a”之类的错误的话,参见上面的帖子:

【已解决】Win7中运行exe出错:应用程序中发生了无法处理的异常。未能加载文件或程序集“Microsoft.mshtml,Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b3f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件

转载请注明:在路上 » 【已解决】两种版本mshtml:.NET中的Microsoft.mshtml的Microsoft.mshtml.dll和COM中的Microsoft HTML Object Library的mshtml.tlb之间的区别

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
62 queries in 0.254 seconds, using 12.15MB memory