生成密钥文件
提前准备好一个密钥文件,因为将注册为 COM 组件时要求提供签名。
打开 Visual Studio 命令行工具,执行:
1 | sn -k xxx.snk |
得到文件后放到工程目录下即可。
.NET Framework 工程设置
传统风格的工程文件和新的 SDK style 稍微有些区别,所以分开说。
传统风格工程
默认 COM 可见性
打开工程设置窗口,点击程序集设置
这里不建议勾选,因为 .NET 默认会将程序集中所有访问权限为public
的类都对外公开,这当然是不合适的。
所以这里默认没有勾选,实际上,这里的选项会影响AssemblyInfo.cs
文件中ComVisible
属性值。
为 COM 互操作注册
选项决定在编译后是否自动注册 DLL,根据自身需要设置。
对应的工程属性为:
1 | <RegisterForComInterop>true</RegisterForComInterop> |
设置签名文件
对应的工程属性为:
1 | <SignAssembly>true</SignAssembly> |
然后编写一个测试接口和其实现即可,注意要在实现类上设置[ComVisible(true)]
。
1 | using System.Runtime.InteropServices; |
手动注册 COM 组件
如果设置了RegisterForComInterop
属性的话会在编译后自动注册,否则就需要手动注册。
而用 .NET Framework 开发的 COM 组件不能用传统的regsvr32
去注册,要用运行时自带的RegAsm.exe
工具注册:
1 | %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ClassLibrary2.dll /tlb:ClassLibrary2.tlb /codebase |
注意我这里用的是 x64 架构注册,注册 COM 组件时要确认架构一致性。
卸载的话使用/u
选项:
1 | %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ClassLibrary2.dll /u |
我们可以用 RegDllView 软件查看系统 COM 注册情况。
测试接口
COM 组件的好处是语言无关性,我们可以编写一个 VBScript 脚本测试接口:
1 | Dim obj |
结果正确
NET.Sdk 风格工程
.NET Sdk 风格的工程文件因为没有界面,所以需要手动编辑
1 | <Project Sdk="Microsoft.NET.Sdk"> |
因为 .NET Sdk 风格工程没有AssemblyInfo.cs
文件设置程序集属性,这导致项目默认会将所有public
的类都公开。
这就需要我们手动将程序集属性ComVisible
设置为false
。
1 | <Project Sdk="Microsoft.NET.Sdk"> |
不同于传统风格工程文件是将属性写在代码中,Sdk 风格将属性配置在工程文件中。
.NET 工程设置
对于新的 .NET 框架,使用EnableComHosting
属性决定是否生成 COM Host(一个用于注册的本机 DLL 文件)。
1 | <Project Sdk="Microsoft.NET.Sdk"> |
当EnableComHosting
属性为true
时,编译后会多出一个[ProjectName].comhost.dll
文件。
这不是 .NET 程序集,而是一个本机的 DLL 文件。
而这个 DLL 文件导出了注册 COM 需要的几个标准方法,用 C++ 开发过 COM 组件的一定都明白了。
可以看出 .NET 不同于 .NET Framework 框架的处理方式。所以这里不再需要用RegAsm.exe
去注册了,直接原生注册即可。
1 | regsvr32 ClassLibrary2.comhost.dll |
卸载:
1 | regsvr32 /u ClassLibrary2.comhost.dll |