2 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
正如Zohar Peled所建議的,最好的方法是使用RegAsm.exe:
創(chuàng)建一些 C# 類(lèi)庫(kù)“TestProject”:
using System.Windows.Forms;
namespace TestProject
{
// Note. Only public classes are exported to COM!
public class Test
{
// Note. Only public methods are exported to COM!
public void testIt() {
MessageBox.Show("Yellow world");
}
}
}
重要提示:只有公共類(lèi)被導(dǎo)出到 COM。并且只有這些類(lèi)的公共方法可通過(guò) COM 對(duì)象實(shí)例使用。
簽署項(xiàng)目。
在 AssemblyInfo.cs 中設(shè)置[assembly: ComVisible(false)]為[assembly: ComVisible(true)]. 注意:您還可以在要向 COM 公開(kāi)的每個(gè)類(lèi)之前使用屬性 [ComVisible(true)]。這只是將默認(rèn)設(shè)置設(shè)置為true在構(gòu)建 API 時(shí)更容易使用
構(gòu)建項(xiàng)目。
運(yùn)行 regasm。請(qǐng)記住使用正確版本的 Regasm(32 位/64 位)和適用于您的 .NET 框架的版本:
# .NET v4.5 64-bit
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" -tlb -codebase "C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.dll" -verbose
# .NET v4.5 32-bit
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" -tlb -codebase "C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.dll" -verbose
...
Regasm 應(yīng)該輸出如下內(nèi)容:
Microsoft .NET Framework Assembly Registration Utility version 4.7.3056.0
for Microsoft .NET Framework version 4.7.3056.0
Copyright (C) Microsoft Corporation. All rights reserved.
Types registered successfully
Type 'TestProject.Test' exported.
Assembly exported to 'C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.tlb', and the type library was registered successfully
現(xiàn)在您可以在 VBScript 中測(cè)試該文件,例如:
Dim o As Object
Set o = CreateObject("TestProject.Test")
Call o.testIt

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
請(qǐng)注意,這會(huì)使您的項(xiàng)目中所有與 COM 兼容的類(lèi)也對(duì) COM 可見(jiàn),而您可能不希望出現(xiàn)這種情況(請(qǐng)參閱此處和此處)。如果您沒(méi)有明確設(shè)置 UUID,如果您使用 VB 或 VBA(不是 VBScript,后者是后期綁定的)等早期綁定客戶端訪問(wèn)類(lèi),那么您在部署時(shí)就會(huì)遇到問(wèn)題。
是的,它不是“干凈的”,但 COM 也不是,尤其是當(dāng)您想將它公開(kāi)給后期綁定客戶端實(shí)時(shí) VBScript 時(shí)。
我還將您的公共字段更改為屬性,這對(duì)公共成員來(lái)說(shuō)更標(biāo)準(zhǔn):
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface IKlass
{
[DispId(0)]
public int value {get; set;}
[DispId(1)]
public void doSomething();
}
- 2 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報(bào)