现在的位置: 首页 > 综合 > 正文

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

2013年11月20日 ⁄ 综合 ⁄ 共 2456字 ⁄ 字号 评论关闭

如何使用C#在.net 2.0 framework下编写ActiveX的中文资料不多,而且被大家广为转载的中文资料还有错误(不知道是否是因为net 2.0和1.0有出入的关系)。(转载一篇,我也还没试过)

本文包括了如何编写,部署,还有更新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给注销了。

 

抱歉!评论已关闭.