在.NET应用程序中不注册使用ocx Com组件

来源:互联网 发布:linux访问https地址 编辑:程序博客网 时间:2024/05/01 16:19
 源文:http://www.cnblogs.com/ghost_boy/archive/2008/07/23/1249883.html

项目中的图形报表这块用到了ocx组件,然而项目中的应用程序是设计成用ClickOnce发布的,所以遇到了在.net应用程序中如何重用ocx组件的问题。

一般来说,要使用COM组件,就要把该组件注册到机器上,所以在ClickOnce中使用应用程序,不外乎有以下两种方法:

(1)自己创建一个安装包来注册和卸载该COM组件,安装包可以通过一个Setup应用程序来实现,然后通过ClickOnce发布。(这样你的卸载工作就包含了两部分:卸载ClickOnce应用程序和卸载注册的COM组件)。

(2)利用Registration-Free COM技术。Reg-Free COM能让你在不注册COM组件的情况下使用该组件。

在本文中只会讲到第二种方法,毕竟在这个时代,绿色的才是收欢迎的。

Reg-Free COM也叫做Side-by-side技术,好像最初也是应DLL Hell问题而生,就是COM组件的版本,ID等信息不是写到注册表里,而是通过一个应用程序清单(Manifest文件)来维护,代码如下:

Code

其中和组件调用息息相关的两个节点就是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发布了。

 

原创粉丝点击