Dot-Net

是否可以向 COM 互操作呼叫者公開 C# 列舉,如果可以,如何?

  • February 4, 2019

我有一個通過 COM 互操作呼叫的託管程序集。像 VBScript 客戶端、Perl 客戶端等等。

班級裝飾著

[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

然後我當然會做 regasm 的事情,所有的方法都工作得很好。

但是程序集中也有列舉類型。我想對列舉值使用符號名稱 COM 應用程序。

如何通過 COM 互操作公開列舉?我只需要添加這些屬性嗎?

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

然後,如何在 VBScript 中引用這些符號名稱?我在 OleView 中看不到列舉類型。(我應該嗎?)我在 OleView 中看到了所有其他類型。

VBScript 和其他後期綁定客戶端使用 IDispatch 呼叫對像上的方法。因此,這些語言無法訪問類型庫中的類型資訊——它們只是從 GUID 創建一個對象,返回一個 IDispatch 指針,然後開始按名稱呼叫方法。

我不確定問題的 COM 互操作部分,但即使列舉確實顯示在 OleView 中,您也無法直接使用它們。

但是,如果您能夠在 typelib 中發布列舉,我在 eons 之前編寫了一個工具,它可以生成一個腳本文件(vbs 或 js),其中包含來自 typelib 的所有列舉作為常量。

見這裡:http ://www.kontrollbehov.com/tools/tlb2const/

我使 COM 可見的(到目前為止).NET 程序集也有一個列舉類型,它在 OleView 中顯示得很好。我讓整個庫對 COM 可見,所以

[ComVisible(true)]

沒有必要。你的列舉類型是公開的嗎?

發生的一件事是不同的列舉以“列舉類型名稱”_為“前綴”:

public enum DataType
{
   INT32,
   FLOAT64,
   INT8
}

轉換成:

typedef [...]
enum {
   DataType_INT32 = 0,
   DataType_FLOAT64 = 1,
   DataType_INT8 = 2
} DataType;

在類型庫中。

引用自:https://stackoverflow.com/questions/1276442