一、编写控件类
一般而言,一个控件只提供一个暴露给COM的类。一般形式如下:
[Guid("04D4D38F-9A36-47C6-A657-1B2313B21DF2")]
[ProgId("Product.ActiveX.ProductActiveX")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class ProjectActiveX : IObjectSafety, ICommand{
}
?
其中:
ProgId is the unique name of the class that will be exposed as COM object.
ClassInterface is the type of the COM interface that will wrap our .NET class
Guid is the unique GUID that will expose our class to be used as COM object. To create a new GUID, you
can use the tool in Visual
Studio Tools -> Create GUID
ComVisible tells that our class can be used as COM object
?ClassInterface分为None、AutoDispatch、AutoDual,None和AutoDispatch较为常用。当COM类为单独类时使用AutoDual,当COM类实现某
接口时,使用None。具体区别请参考Introducing the Class Interface、ClassInterface。
暴露给COM的类通常需要强命名,命名工具为Sn.exe。
二、安全性问题
在使用控件的时候,对于IE弹出的一下提示。可以通过让ProjectActiveX实现接口IObjectSafety。可以参考这篇文章。
我已经验证通过这种方法可以解决这个问题。但是网上有的人说,这篇文章中描述的方法行不通,参考这里。两篇文章的接口是一样的,只是实现不一样。这篇文章中的方法我暂时没有去测试,有兴趣的读者可以参考一下。
三、控件的注册
控件可以通过命令注册,也可以通过安装工程来注册。这两种方式我都有做法,但是非常推荐使用安装工程。
以下是通过命令来注册的
例子:
RegLib.bat: 注册命令
regasm /codebase ../lib/Product.dll
pause
?UnRegLib.bat
regasm /u ../lib/Product.dll
pause
?注意dll所处的路径,其中需要用到RegAsm.exe。
接下来主要讲使用Setup工程注册。
- File-->New Project-->Other Project Types-->Setup and Depolyment-->Visual Studio Installer-->Setup Project
- 右击Setup工程-->Add-->Project Output-->选择工程名,选中"Primary output"
- 右击刚才新建的主工程-->Property-->修改Register属性为vsdrpCOM。
- 创建快捷方式:右击Setup工程-->View-->File System-->
Application Folder-->添加安装包的图标?
User's Programs Menu-->修改菜单栏中卸载程序的快捷方式,并修改改快捷方式的图标。
- 配置是否自带.Net Framework: 右击Setup工程-->Property-->选择Prerequisties-->
如果需要自带.Net Framework,则勾选"Microsoft .Net Framework 4(x86 and x64)",并选择install location第二项。
如果需要在线安装.Net Framework,则不需要?"Microsoft .Net Framework 4(x86 and x64)",并选择install location的第一项,指示从微软网站下载。
- 当然还有cab的制作,这个俺还没有做过,可以参考文章、WEB下的客户端控件(OCX)的开发应用第3部分。
四、控件的升级
- 控件本身的GUID的修改。[重新生成一个GUID]
- 修改setup工程的版本号。
- 修改发布页页的ClassID。
? ? ?详细步骤课参考这篇文章的后半部分。
五、许可证
可参考第七部分的第四篇文章,可参考获取Assembly的Public Key Token。
六、控件的使用
在html中加入:
<OBJECT id="ProjectActiveX" classid="clsid:04D4D38F-9A36-47C6-A657-1B2313B21DF2" codebase="setup/Product控件.exe"></OBJECT>
? 其中clsid为COM类的值,codebase为下载控件的地址,id用于在html中控件的类对象。Star56ActiveX相当于控件的类对象,调用属性和方法的放回跟实际的类对象一致。
还有一点值得说明,判定控件是否加载成功的js代码为:
ProjectActiveX.object == null
ProjectActiveX.object为空则说明加载失败,否则加载成功。
七、扩展阅读
- Create ActiveX in .NET Step by Step
- 基于.NET开发 ActiveX 控件(一) 基础篇
- 基于.NET开发 ActiveX 控件(二) 安全篇
- 基于.NET开发 ActiveX 控件(三) 部署篇
- 大小: 10.5 KB
- 大小: 40.1 KB