Visual Studio 创建Com组件

249 阅读3分钟

Visual Studio 创建Com组件

创建Com组件

Com组件创建的规则

com组件以接口的方式对外开放。

  1. 所要导出的类必须为公有;
  2. 所有属性、方法也必须为公有;
  3. 要导出的属性、方法必须用接口方式;
  4. .net生成com组件只能提供给其他程序使用,例如javajsvbs等。CLR拒绝导入.net生成的com组件。因此在vs中无法使用.net生成的com组件;
  5. 必须将程序集设置为[assembly: ComVisible(true)]可见,其他程序才能调用组件中的函数;
  6. 必须给每个类添加[ProgId("TestCom.Show")]注册表中的名称,空间+类名 记录到注册表中,给其他语言创建对象用;
  7. 组件只有组成到全局缓存或注册表中后才能使用;
  8. 通过引用计数,组件对象自己负责动态创建与销毁,从而屏蔽了不同编程语言之间的内存分配语义差异;

创建Com组件(Visual Studio 2022

  1. 创建.NET Framework类型项目

image.png

image.png 2. 修改项目配置为x64(修改x86也可以)

image.png 3. 配置项目COM可见性

image.png

image.png 4. 设置程序集签名

image.png 5. 生成Guid

image.png 6. 编译程序

image.png

  • 重新以管理员权限运行Visual Studio 2020,然后再编译即可。
  1. 完整代码如下
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
  1. 以管理员身份运行cmd,切换目录到gacutil.exe所在目录
cd /d C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64

image.png 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

image.png 3. 全局卸载注册的Com组件

gacutil.exe -u wr_com_test

image.png

  • RegAsm
  1. 以管理员身份运行cmd,切换目录到RegAsm.exe所在目录;
  2. 注册Com组件到注册表;
RegAsm.exe F:\Study\.net\starter\wr_com_test\wr_com_test\bin\x64\Debug\wr_com_test.dll

image.png

image.png 注意:可能出现一下报错

RegAsm : error RA0000 : “F:\Study\.net\starter\wrcom\wrcom\bin\x64\Debug\wrcom.dll”不是有效的 .NET 程序集,因此未能加载它

以上报错的原因是.NET Framework对应的版本不对导致,比如当前项目是基于.NET Framework4.7.2版本创建的,且编译生成的dllx64版本,则对应的RegAsm.exe的目录也应该是.NET Framework4.x下的x64版本目录下:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe image.png 3. 从注册表中移除注册的Com组件

RegAsm.exe /u F:\Study\.net\starter\wr_com_test\wr_com_test\bin\x64\Debug\wr_com_test.dll

image.png 注意:RegAsm.exe的使用依赖文件实际的路径,比如卸载的时候,依然需要指定文件的实际路径才行,但gacutil.exe在卸载时无需限定文件路径

调用Com组件

  • VBS调用
  1. 新建文本文件,输入以下内容,然后修改文件后缀为.vbs
set com= CreateObject("wr_com_test.ShowHobby")
dim hobbies
hobbies=com.ShowHobbies("I like pingpong, basketball and football.")
msgbox hobbies
  1. 双击执行.vbs文件

image.png

参考链接:在vs2022环境中用C#创建COM组件 - 小林野夫 - 博客园 (cnblogs.com)