Dot-Net
是否可以向 COM 互操作呼叫者公開 C# 列舉,如果可以,如何?
我有一個通過 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 的所有列舉作為常量。
我使 COM 可見的(到目前為止).NET 程序集也有一個列舉類型,它在 OleView 中顯示得很好。我讓整個庫對 COM 可見,所以
[ComVisible(true)]沒有必要。你的列舉類型是公開的嗎?
發生的一件事是不同的列舉以“列舉類型名稱”_為“前綴”:
public enum DataType { INT32, FLOAT64, INT8 }轉換成:
typedef [...] enum { DataType_INT32 = 0, DataType_FLOAT64 = 1, DataType_INT8 = 2 } DataType;在類型庫中。