@自嗨的江江

爱生活爱叽歪

VS2017+Win10 下用C#开发ActiveX控件并手工注册


还是叽歪助手项目接上篇做C#打印控件,把做ActiveX控件和注册的过程记录分享一下。
参考了一些文章并实践,发现很多的文档提供的方式方法都是不能完成注册成功的(不知道是我本地换进问题还是.net的regAsm.exe的bug,反正在我机器和公司的一些机器上都不能注册成功)
这里等下在重点分享我的注册过程,先看看做ActiveX控件,这个比较简单,baidu一下,会有很多资料,无论用什么VS版本,擦不多都类似,也都管用。
ActiveX控件,首先是一个.net的UserControl控件,必须继承UserControl,那么重点来了,在继承.net用户控件的主体控件代码(参考上篇)上必须声明当前类的GUID,例如:

 [Guid("C859EF35-F8FF-4CDC-812B-1FB71B3F7331")]
    public partial class ClientPrinter: UserControl,IObjectSafety

这里的GUID就是生命当前控件面向COM组件的classid,在html网页的<object>标签里调用会用到,
然后,这里可以看到ActiveX控件的主体类继承了IObjectSafety的接口,这个是实现是有关在客户端运行的安全,必须实现,这个接口的代码基本是固定的,这里离不贴了,baidu一下会非常多。下面重点看看开发好的控件如何注册。

开始用regAsm工具注册,无论怎么弄,就是无法调用,查看注册表信息也都写进去了,相当的不服气呀!没办法,在VS2017里面,把项目属性的“注册COM组件”打勾上,再编译,我X,注册搞定了。这次更加不服气了...
于是开始找原因,查注册表,发现了问题,注册表文件跟用regAsm工具写的注册表完全不一样,于是导出,在写一个bat批处理文件,修改文件路径按vs生成的注册表来注册,OK了,成功搞定,再换几台机器试试都搞定。
接下来看看成功和失败的注册表文件,大家自己再分析分析~~

先贴失败的:

[HKEY_CLASSES_ROOT\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}]
@="Jonvie.Tools.OrderPrinter.ClientPrinter"

[HKEY_CLASSES_ROOT\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\Implemented Categories]

[HKEY_CLASSES_ROOT\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]

[HKEY_CLASSES_ROOT\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="Jonvie.Tools.OrderPrinter.ClientPrinter"
"Assembly"="Jonvie.Tools.OrderPrinter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cafdcbd9bdab0c14"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Users/Jonvie/Source/Workspaces/JonvieCom/Tools/Jonvie.Tools.OrderPrinter/bin/Public/Jonvie.Tools.OrderPrinter.dll"

[HKEY_CLASSES_ROOT\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\InprocServer32\1.0.0.0]
"Class"="Jonvie.Tools.OrderPrinter.ClientPrinter"
"Assembly"="Jonvie.Tools.OrderPrinter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cafdcbd9bdab0c14"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Users/Jonvie/Source/Workspaces/JonvieCom/Tools/Jonvie.Tools.OrderPrinter/bin/Public/Jonvie.Tools.OrderPrinter.dll"

[HKEY_CLASSES_ROOT\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\ProgId]
@="Jonvie.Tools.OrderPrinter.ClientPrinter"

再看成功的:

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}]
@="Jonvie.Tools.OrderPrinter.ClientPrinter"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\Implemented Categories]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="Jonvie.Tools.OrderPrinter.ClientPrinter"
"Assembly"="Jonvie.Tools.OrderPrinter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cafdcbd9bdab0c14"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Users/Jonvie/Source/Workspaces/JonvieCom/Tools/Jonvie.Tools.OrderPrinter/bin/Public/Jonvie.Tools.OrderPrinter.dll"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\InprocServer32\1.0.0.0]
"Class"="Jonvie.Tools.OrderPrinter.ClientPrinter"
"Assembly"="Jonvie.Tools.OrderPrinter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cafdcbd9bdab0c14"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///C:/Users/Jonvie/Source/Workspaces/JonvieCom/Tools/Jonvie.Tools.OrderPrinter/bin/Public/Jonvie.Tools.OrderPrinter.dll"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{C859EF35-F8FF-4CDC-812B-1FB71B3F7331}\ProgId]
@="Jonvie.Tools.OrderPrinter.ClientPrinter"

知道原因了么?我也不太清楚,反正这样就可以用。打包*.cab文件的话,就得自己写处理程序然后再打包了~

不允许评论