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文件