今天在安装winform应用程序时,发现运行良好的程序在客户机上无法启动。调试了半天,发现原来是第三方程序中包含了对mshtml组件的调用,郁闷。


     mshtml 在有的环境中被安装,而在有些环境中却没被安装。如:在我们已经装了Visual Studio 2005,Visual Studio 2008的环境中,都可以直接调用mshtml,而只安装了net framework2.0的电脑中,则没有安装该组件,导致调用该组件的程序无法运行,或运行时报错。


     于是乎,在此小结一翻,以便回顾。一般,我们可以在电脑%systemroot%\system32\mshtml.dll位置,找到该组件。而net中,该组件又实现了Com接口,通过COM Interop service调用。因此,net中调用的mshtml实际上是%Program Files%\Microsoft.NET\Primary Interop Assemblies\目录下的Microsoft.mshtml.dll。而我们使用的程序中,特别是在安装了Visual Studio 2005或Visual Studio 2008后,mshtml已经被注册到了GAC(全局程序集缓存)。因此,在此环境下更是可以直接调用了,而不用让程序随时带着个小尾巴(Microsoft.mshtml.dll)到处跑。
     

     以个人本机为例,总结了一下,mshtml的问题处理方式如下:

     1. C:\WINDOWS\system32\mshtml.dll 为win32下的调用,net无法使用

     2. 查看C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll 文件,如果有此文件,则可以拷贝此文件,并让开发的程序引用该文件,在客户机上安装时,该文件要一起打包安装。如果没有该文件,可以尝试在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下运行RegAsm.exe,注册1.中描述的mshtml.dll组件,注册后,Primary Interop Assemblies目录中便出现了该dll。

     3. 在安装了net sdk的环境中,Visual Studio 2005和Visual Studio 2008都安装了sdk,可以运行gacutil.exe,将Primary Interop Assemblies目录下的Microsoft.mshtml.dll注册到全局程序集缓存中,因此在运行程序时,程序便可不用再带着Microsoft.mshtml.dll一起移动了。

     另:a>一般在开发电脑中会有sdk,因此可以将Microsoft.mshtml.dll注册到全局程序集缓存中,但是在客户机上,通常只装了.Net Framework,还是让程序带着Microsoft.mshtml.dll一起运行更方便。

           b> 另外,有时我们也可以在C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11 目录或  C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12目录下发现该组件。不要使用这些dll, net需要使用有强名称的dll,这些不适用。

以上记录仅为个人小结,如有错误,请留言告知,万分感谢!!!