使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
2010-07-06 15:41
435 查看
大概在1个半月前,自己探索了一下如何使用C#在.net 2.0 framework下编写ActiveX的东西。发现中文资料不多,而且被大家广为转载的中文资料还有错误(不知道是否是因为net 2.0和1.0有出入的关系)。最近Lori又要做相关方面的工作。所以也就算写上一个书面的东西以便他的参考,而且也算是对以前的工作的总结。免得忘记了。
本文包括了如何编写,部署,还有更新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给注销了。
本文包括了如何编写,部署,还有更新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给注销了。
相关文章推荐
- 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
- 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
- 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
- 使用.net framework 2.0用c#编写ActiveX控件(编写,部署,升级更新)
- SQL SERVER 数据库 批量 脚本 升级 更新工具 (C# .Net 2.0)
- SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
- Chapter 1: .Net 2.0 Framework 基础之 使用值类型
- 如何在使用windows mobile设备上部署新版本的.net compact framework
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序
- RDIFramework.NET平台代码生成器V3.2版本全新发布-更新于2017-02-27(提供下载-免费使用)
- 九、C#编程实战演习ABC 1、使用Visual Studio .NET编写C#程序
- 使用 C# 编写简易 ASP.NET Web 服务器
- 使用 .NET Compact Framework 2.0 生成 Wi-Fi 发现应用程序
- Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)
- RDIFramework.NET平台代码生成器V3.2版本全新发布-更新于2017-02-27(提供下载-免费使用)[申明:来源于网络]
- 圣殿祭司:ASP.NET 2.0 开发详解——使用C#——全国购书地址一览表
- 开源《热血传奇》服务端引擎(C#编写),可以顺利进行游戏(更新编译和部署教程)
- Visual Studio2017中编写ASP.NET程序时使用C# 7.0元组Tuple新特性的一点注意事项
- 总结在使用VB 6.0和C#编写ActiveX控件的实践 (一)