規則
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、通過引用計數,組件對象自己負責動態創建與銷毀,從而屏蔽了不同編程語言之間的內存分配語義差異
環境
我用的是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、雙擊運行。