在vs2022环境中用C#创建COM组件

规则

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

1:所要导出的类必须为公有;
2:所有属性、方法也必须为公有;
3:要导出的属性、方法必须用接口方式;

 

interface IName
    {
        [DispId(1)]//为函数的标识:C#代码中必须定义了接口,才可以按照此方法实现调用。 
        void ShowAge(string age);
        string Name { get; set; }
    }

4、.net生成com组件只能提供给其他程序使用,例如java、 js、vbs等。  CLR拒绝导入.net 生成的com组件。因此在vs中无法使用 .net生成的com组件

5、必须将程序集设置为[assembly: ComVisible(true)]可见,其他程序才能调用组件中的函数
6、必须给每个类添加[ProgId("TestCom.Show")]注册表中的名称,空间+类名 记录到注册表中,给其他语言创建对象用

7、组件只有组成到全局缓存和注册表中后才能使用。

8、通过引用计数,组件对象自己负责动态创建与销毁,从而屏蔽了不同编程语言之间的内存分配语义差异

其他相关的内容请查看 microsoft.com

  环境

 

我用的是C#10 vs2022 .net framework 4.72 类库

.net生成com组件只能提供给其他程序使用,例如java、 js、vbs等。  CLR拒绝导入.net 生成的com组件。因此在vs中无法使用 .net生成的com组件

设置

1、新建.net framework 4.7.2类库。

2、设置

 

 

3、设置签名

 

 4、修改可见性

[assembly: ComVisible(true)]

 

 或者 这两种方式是一样的。都是修改配置文件

 

 5、生成GUID

 

 

 C#代码:C#代码中必须定义了接口,才可以按照此方法实现调用。一定要写ProgId。

 

[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)]..... 

 

 

 

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace TestCom
{

  
    [Guid("9A1EAE37-2698-466E-AC0C-0BDA1934A0E5")]

    interface IName
    {
        [DispId(1)]//为函数的标识:C#代码中必须定义了接口,才可以按照此方法实现调用。 
        string ShowAge(string age);
        string Name { get; set; }
    }

  
    [Guid("169B06D6-CFCC-4B65-B04F-8CB3B361A493")]
    [ProgId("TestCom.Show")]//空间+类名 记录到注册表中,给其他语言创建对象用
    public class Show : IName
    {
        public string Name { get; set; }
        public string ShowAge(string age)
        {
            Console.WriteLine($"Age:{age}");

            return age;
        }
    }
}

 

 

 

 

 

编译生成解决方案,Debug目录中会生成TestCom.dll文件
注:生成时平台必须使用x64,不然java会编译错误。

至此,代码就OK了。

com组成必须注册后才能用,以下是windows平台的com组件注册。

注册com组件

1、操作环境windows10+vs2022

cmd.exe位置在 C:\Windows\System32目录下,

以管理员的身份运行cmd.exe,然后输入以下命令进入gacutil.exe所在的文件夹。
cd /d C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64

2、注册全局缓存, 注册成功后,注册表就多一项记录。
gacutil -I "C:\Users\HP\source\repos\TestCom\TestCom\bin\Debug\TestCom.dll"
从全局缓存中卸载:gacutil -u TestCom  

 

 


3、 注册进注册表
 C:\Windows\WinSxS\x86_regasm_b03f5f7f11d50a3a_4.0.15788.0_none_b7e35132180143ba\RegAsm.exe C:\Users\HP\source\repos\TestCom\TestCom\bin\Debug\TestCom.dll
 
重注册表中卸载:RegAsm  /u
 C:\Windows\WinSxS\x86_regasm_b03f5f7f11d50a3a_4.0.15788.0_none_b7e35132180143ba\RegAsm.exe  /u C:\Users\HP\source\repos\TestCom\TestCom\bin\Debug\TestCom.dll

查看注册表regedit,HKEY_CLASSES_ROOT中是否有TestCom.Show项。如果有,则说明注册COM成功;如果没有,请重新注册

 

 


 总结:自己编写程序生成的dll,用此法可注册。

 

通过 VBS 实现跨语言调用COM

1、打开记事本写入如下代码,然后把.txt 改成.vbs.

编写vbs代码 TestCom.Show为“Show类”设置的“ProgID”而ShowAge为类中的函数名

set com= CreateObject("TestCom.Show")
dim num
num=com.ShowAge("I am 14 ")
msgbox num

 

 2、双击运行。

 

posted @ 2022-01-15 20:33  小林野夫  阅读(6052)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/