在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、雙擊運行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM