Visual Studio 创建Com组件
创建Com
组件
Com
组件创建的规则
com
组件以接口的方式对外开放。
- 所要导出的类必须为公有;
- 所有属性、方法也必须为公有;
- 要导出的属性、方法必须用接口方式;
.net
生成com
组件只能提供给其他程序使用,例如java
、js
、vbs
等。CLR
拒绝导入.net
生成的com
组件。因此在vs
中无法使用.net
生成的com
组件;- 必须将程序集设置为
[assembly: ComVisible(true)]
可见,其他程序才能调用组件中的函数; - 必须给每个类添加
[ProgId("TestCom.Show")]
注册表中的名称,空间+类名 记录到注册表中,给其他语言创建对象用; - 组件只有组成到全局缓存或注册表中后才能使用;
- 通过引用计数,组件对象自己负责动态创建与销毁,从而屏蔽了不同编程语言之间的内存分配语义差异;
创建Com
组件(Visual Studio 2022
)
- 创建
.NET Framework
类型项目
2. 修改项目配置为
x64
(修改x86
也可以)
3. 配置项目
COM
可见性
4. 设置程序集签名
5. 生成
Guid
6. 编译程序
- 重新以管理员权限运行
Visual Studio 2020
,然后再编译即可。
- 完整代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace wr_com_test
{
[Guid("477F8117-18E4-40DD-AD20-FAFD4276C028")]
interface IHobby
{
[DispId(1)] //为函数的标识
string ShowHobbies(string hobbies);
string Name { get; set; }
}
[Guid("E5609802-F3D0-4DDE-9B7A-26FD6C26BF63")]
[ProgId("wr_com_test.ShowHobby")] //空间+类名 记录到注册表中,给其他语言创建对象用
public class ShowHobby : IHobby
{
public string Name { get; set; }
public string ShowHobbies(string hobbies)
{
Console.WriteLine($"My hobbies are: {hobbies}");
return hobbies;
}
}
}
使用Com
组件
注册Com
组件
gacutil
- 以管理员身份运行
cmd
,切换目录到gacutil.exe
所在目录
cd /d C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64
2. 全局注册上面生成的
Com
组件wr_com_test.dll
gacutil.exe -i F:\Study\.net\starter\wr_com_test\wr_com_test\bin\x64\Debug\wr_com_test.dll
3. 全局卸载注册的
Com
组件
gacutil.exe -u wr_com_test
RegAsm
- 以管理员身份运行
cmd
,切换目录到RegAsm.exe
所在目录; - 注册
Com
组件到注册表;
RegAsm.exe F:\Study\.net\starter\wr_com_test\wr_com_test\bin\x64\Debug\wr_com_test.dll
注意:可能出现一下报错
RegAsm : error RA0000 : “F:\Study\.net\starter\wrcom\wrcom\bin\x64\Debug\wrcom.dll”不是有效的 .NET 程序集,因此未能加载它
以上报错的原因是.NET Framework
对应的版本不对导致,比如当前项目是基于.NET Framework4.7.2
版本创建的,且编译生成的dll
是x64
版本,则对应的RegAsm.exe
的目录也应该是.NET Framework4.x
下的x64
版本目录下:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe
3. 从注册表中移除注册的
Com
组件
RegAsm.exe /u F:\Study\.net\starter\wr_com_test\wr_com_test\bin\x64\Debug\wr_com_test.dll
注意:
RegAsm.exe
的使用依赖文件实际的路径,比如卸载的时候,依然需要指定文件的实际路径才行,但gacutil.exe
在卸载时无需限定文件路径
调用Com
组件
VBS
调用
- 新建文本文件,输入以下内容,然后修改文件后缀为
.vbs
set com= CreateObject("wr_com_test.ShowHobby")
dim hobbies
hobbies=com.ShowHobbies("I like pingpong, basketball and football.")
msgbox hobbies
- 双击执行
.vbs
文件