2009-08-14 64 views
10

我有一個通過COM Interop調用的託管程序集。像VBScript客戶端,Perl客戶端等。是否有可能將C#Enum公開給COM Interop調用者,如果是這樣,怎麼做?

的類與

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

再飾當然我做regasm的事情,所有的方法工作得很好。

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

如何通過COM interop公開枚舉?我只需要添加這些屬性?

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

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

回答

3

VBScript和其他晚期客戶端使用IDispatch來調用對象上的方法。因此,這些語言無法訪問typelib中的類型信息 - 它們只是從GUID創建對象,獲取IDispatch指針並開始按名稱調用方法。

我不確定問題的COM互操作部分,但即使枚舉在OleView中顯示,您也不能直接使用它們。但是,如果您能夠在typelib中發佈枚舉,我在之前編寫了一個工具,可以生成包含typelib中的所有枚舉作爲常量的腳本文件(vbs或js)。

在這裏看到:http://www.kontrollbehov.com/tools/tlb2const/

+0

很好的答案。該工具聽起來非常有用。 – Cheeso 2009-08-14 12:32:27

+0

不幸的是,我沒有一個不斷的Perl生成器...也許是時候再次開發:-) – 2009-08-14 15:33:13

9

我的(到目前爲止只).NET,我把COM可見的組件也有一個枚舉類型,這表明了在OLEVIEW就好了。我整庫是COM可見這樣

[ComVisible(true)] 

是沒有必要的。你的枚舉類型是公共的嗎?所發生

的一件事是不同的枚舉是 '前綴' 與「枚舉類型name'_:

public enum DataType 
{ 
    INT32, 
    FLOAT64, 
    INT8 
} 

變成:

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

類型庫。

+0

當項目設置爲ComVisible(true)時,我所有的枚舉工作正常,但我怎麼樣在VS6 C++項目中使用asm,tlb太大了!我把整個項目設置爲false,暴露了我想要的類和枚舉。類很好,枚舉不是!! ??他們像預期的那樣處於註冊狀態(CLSID),但根本無法訪問。將很感興趣,知道爲什麼.. – 2010-02-10 22:17:18

+1

Upvoted,因爲我找不到任何明確的解釋,COM奇蹟般地重命名您的枚舉值,以引用它們的枚舉類型的名稱,除了這裏。 – 2013-12-10 18:36:18

相關問題