一、编写控件类
一般而言,一个控件只提供一个暴露给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 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。可以参考
这篇文章。
![](http://dl.iteye.com/upload/attachment/0063/6043/a9adf270-7cf0-3be5-99cb-f606cf6d9819.jpg)
我已经验证通过这种方法可以解决这个问题。但是网上有的人说,这篇文章中描述的方法行不通,参考
这里。两篇文章的接口是一样的,只是实现不一样。这篇文章中的方法我暂时没有去测试,有兴趣的读者可以参考一下。
三、控件的注册
控件可以通过命令注册,也可以通过安装工程来注册。这两种方式我都有做法,但是非常推荐使用安装工程。
以下是通过命令来注册的例子:
RegLib.bat: 注册命令
regasm /codebase ../lib/Product.dll pauseUnRegLib.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-->添加安装包的图标
右键主工程-->Create Shortcut to User's Desktop-->修改快捷方式图标和名称。 - 创建卸载快捷方式:右键Application Folder-->Add-->File,选择“c:\windows\system32\msiexec.exe”-->
- 配置是否自带.Net Framework: 右击Setup工程-->Property-->选择Prerequisties-->右击该文件-->Creat Shortcut to Desktop-->修改快捷方式的名称和图标-->修改Augument属性为”/x {ProductCode}“,其中弄个ProductCode可以在安装工程的属性中找到。将改快捷方恨
如果需要自带.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。
六、控件的log
直接使用app.config来配置EL,包括logging,拦截等等的配置都起不了作用(至今没搞懂为啥,希望大牛赐教)。所以,我们可以直接写代码不通过配置文件来配置插件的log。可以参考
这篇文章。
七、控件的使用
在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为空则说明加载失败,否则加载成功。
八、扩展阅读