在.NET应用程序中不注册使用ocx Com组件
来源:互联网 发布:linux访问https地址 编辑:程序博客网 时间:2024/05/01 16:19
项目中的图形报表这块用到了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文件)来维护,代码如下:
<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发布了。
- 在.NET应用程序中不注册使用ocx Com组件
- 在COM应用程序中使用.NET组件
- 在COM应用中使用.NET组件
- 在COM应用中使用.NET组件
- 在COM应用中使用.NET组件
- 批处理注册ocx和com组件
- 如何在Borland Delphi2005中安装OCX、COM 类组件?
- 如何在Vista下用Regsvr32注册dll, ocx等COM组件
- 如何在Vista下用Regsvr32注册dll, ocx等COM组件
- 在ASP.NET中使用非托管COM组件
- 在ASP.NET中使用非托管COM组件
- 在.NET中使用COM+队列组件
- 在ASP.NET中使用非托管COM组件
- 在ASP.NET中使用非托管COM组件
- 在Windows x64注册OCX/DLL组件
- 在.NET 2.0应用程序中使用BackgroundWorker组件 实现进度条
- 不注册直接使用COM组件的方法
- 不注册直接使用COM组件的方法
- 深入理解C语言指针的奥秘(转)
- JAXB体验之旅第二篇:unmarshal
- 利用 ASP.NET 的内置功能抵御 Web 攻击
- List与ArrayList区别
- poj1607
- 在.NET应用程序中不注册使用ocx Com组件
- NetBeans 时事通讯(刊号 # 17 - Jul 22, 2008 )
- ASP.NET AJAX客户端编程
- DB2 V8.2库还原到V8.2.7需手工绑定db2schema包(SQL0443N)
- c++成员初始化(做个笔记)
- 极限救援
- System.Reflection,.net中反射的核心类
- VB当中的新语法(一)
- winCVS应用