利用Registration-Free COM技术。Reg-Free COM能让你在不注册COM组件的情况下使用该组件。在本文中只会讲到第二种方法,毕竟在这个时代,绿色的才是收欢迎的。
Reg-Free COM也叫做Side-by-side技术,好像最初也是应DLL Hell问题而生,就是COM组件的版本,ID等信息不是写到注册表里,而是通过一个应用程序清单(Manifest文件)来维护,代码如下:
<file name="NCK_GraphX.ocx" size="527872" xmlns="urn:schemas-microsoft-com:asm.v1">
<hash xmlns="urn:schemas-microsoft-com:asm.v2">
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<dsig:DigestValue>EF6cGouo8UOn9bciBwdxpQc1voc=</dsig:DigestValue>
</hash>
<typelib tlbid="{7c2a586f-90a3-4e38-b030-5910da895154}" version="1.0" helpdir="" resourceid="0" flags="CONTROL,HASDISKIMAGE" />
<comClass clsid="{1a723edc-f2f8-4e8c-be81-2da0c4dbc932}" threadingModel="Apartment" tlbid="{7c2a586f-90a3-4e38-b030-5910da895154}"
progid="NCK_GraphX.NCK_Graph" description="NCK_Graph コントロール" />
</file>
其中和组件调用息息相关的两个节点就是typelib和comClass了,应用程序正是通过这两个节点提供的信息来调用COM组件的。
使用Reg-Free COM,非常重要的一点就是要在属性框中将改OCX文件的Isolated属性置为True,切记。
好了,下面就说一下如果生成Manifest文件。
Manifest文件的生成有三种方法:
(1)最简单的方法,用IDE发布一下应用程序就有了。
(2)使用工具Mage.exe
(3)使用工具MageUI.exe
(注)两个工具都在C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin下面
但 是在有些情况下,并不能简单地用IDE发布一下就行了。比如在我们的项目中,用到ClickOnce的按需下载功能,这就要设定Manifest文件中的 group属性,而客户又不想在每次改group名的时候就发布一下,所以就把group名放到了数据库中,自己写了一个发布工具来发布应用程序,这就要 用调用Mage.exe。
一开始用到的做法是:生成Manifest文件(Create命令)->签名(Sign命令)->修改Manifest文件(作为XML文件处理)->重签名(Update命令)。
因为Manifest文件含有数字签名,一经修改,立即无效,必须使用证明书重新签名才行(即使用Update命令更新一下)。问题出来了,group信息可以加的上,COM信息却被删掉了。
调查下来,原来Update命令会删掉自己认为无效的节点,但是Sign命令却不会。
换个流程:生成Manifest文件(Create命令)->修改Manifest文件(作为XML文件处理)->签名(Sign命令)。
一切OK,然后再生成Application文件,签名就可以使用ClickOnce发布了。
参考资料:
Simplify App Deployment with ClickOnce and Registration-Free COM