天天看点

使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)

  Net Framework已经越来越普及,不过在使用.net framework 2.0编写ActiveX插件方面。相关的介绍比较少,而且因为net framework版本的原因,一些1.0 Framework的编写方法并不适用于.net framework 2.0版本,笔者就在此简单地介绍一下自己对.net framework2.0 编写ActiveX控件的一些心得体会。本文包括了如何编写,部署,还有更新ActiveX控件  首先提及一下本人参考的几篇文章,国内广为转载的那篇介绍如何使用C#的程序的文章的出处就是:http://www.cnblogs.com/homer/archive/2005/04/01/86473.html(一共三篇)还有一个中文的说明http://www.dvpx.com/index_article_display.aspx?Fid=10&id=74笔者也是从这一个文章作为起点的。可是这篇文章在ActiveX包的发布一部分说的不是很全面。而且更加关键的是不知道是因为.net framework版本的原因或是因为作者的疏忽。里面关于一个Com口的声明有错误。  首先指出错误的地方:在文章中IObjectSafety的声明如下[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { // methods void GetInterfacceSafyOptions( System.Int32 riid, out System.Int32 pdwSupportedOptions, out System.Int32 pdwEnabledOptions); void SetInterfaceSafetyOptions( System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions); }

  可是这样的声明并不能起到相应的作用。接口声明出错。正确的声明见如下网页http://www.pinvoke.net/default.aspx/Interfaces/IObjectSafety.html

  其次还有所一下关于CAB包部署方面的步骤

  其中文章里面的[hook1]run= msiexec /i %EXTRACT_DIR%/ActiveXInstaller.msi /qn这个就是在Cab包解压缩后自动运行的文件。

  从网上查询来看,绝大部分的ActiveX Cab包的部署都是通过C++所写的Dll来作为示范的,而C#同C++写成的Dll还是有所区别的。下面是一个我参考过的的关于部署的例子http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,df3f1be8-62bc-491c-935e-570ebfe53164.aspx

  现在说说我的想法

  我知道的部署方式有两种。

  第一种比较麻烦,就是使用regasm命令来部署比较熟悉部署C++的ActiveX的人都知道regsvr32是注册c++写的ActiveX包的命令。而regasm则是注册在.net Framework下编写的ActiveX的命令。具体的步骤就是在上面的Cab1中文run= regasm/i %EXTRACT_DIR%/xxxx.dll /codebase (xxxx.dll为打包进入的dll文件)(方式和部署C++写的ActiveX的Dll差不多,只是把regsvr32命令替换成为regasm)

  第二种也是比较好的(包括未来的更新)就是使用VS自带的安装程序进行安装具体思路如下在ActiveX的Solution中加入一个Setup Project工程,添加一个Project OutPut把ActiveX的工程加入该Project OutPut中。之后Register属性应该为True这个时候就可以生成一个安装文件。在打包CAB包中应该把Setup Project生成的打包装入msi文件打包放入Cab包中而且编写其inf文件

  注:关于如何制作CAB包可以参考以下文章http://blog.joycode.com/felix/articles/32905.aspx关于Cab包的格式可以参考以下文章http://msdn.microsoft.com/library/default.asp?url=/workshop/delivery/download/overview/infarchitecture.asp?frame=true

  接下来是更新。用C#写的ActiveX的问题在于注册后所看见的ActiveX版本号也正是.net Framework的版本号,而不是Dll文件的版本号。所以用原来的ActiveX更新方式有问题。不过可以正好利用Setup Project的更新方式。进行更新。

  把Setup Project的RemovePreviousVersion属性设置为True这样。自动删除之前的版本。Setup Project是用一个GUID来标示是否是同一个SetUP Project。(注不是ActiveX的GUID)。所以在写了新的版本的时候。需要更新客户端的ActiveX可以使用如下步骤

  1.改变ActiveX的GUID(不是Setup Project)的GUID。

  2.提升Setup Project的版本号。

  3.改变网页中的ActiveX的classid为新的ActiveX的ID

  这个时候。当用户登陆网页时就会因为发现了新的ActiveX控件提示下载(GUID改变)。而下载后的安装程序使用Setup Project的GUID发现已经安装了旧版本。先卸载旧的安装版本。再卸载就安装版本的时候。已经自动地把旧的ActiveX给注销了。