2011-07-15 67 views
2

我用.net程序集替換(部分)Delphi COM庫。我已經將一些COM接口和枚舉移到了.net程序集中。除了使用{enum_type_name} _ {enum_value_name}命名約定將枚舉導出到類型庫之外,一切都很好。是否可以使用屬性指定COM枚舉字段名稱?

[ComVisible(true)] 
[Guid("318f9e87-444c-11d5-aed1-00105a758da4")] 
public enum KeyIDEnum 
{ 
    keLeft = 0, 
    keCentre = 1, 
    keRight = 2 
} 

變爲

[ 
    uuid(318F9E87-444C-11D5-AED1-00105A758DA4), 
    version(1.0) 
] 
typedef enum tagKeyIDEnum 
{ 
    KeyIDEnum_keLeft = 0, 
    KeyIDEnum_keCentre = 1, 
    KeyIDEnum_keRight = 2 
} KeyIDEnum; 

我想知道是否有任何的方式來覆蓋此默認行爲,並指定枚舉值的名稱,可能使用的屬性。就像:

[ComVisible(true)] 
[Guid("318f9e87-444c-11d5-aed1-00105a758da4")] 
public enum KeyIDEnum 
{ 
    [Name("keLeft")] 
    keLeft = 0, 
    [Name("keCentre")] 
    keCentre = 1, 
    [Name("keRight")] 
    keRight = 2 
} 

我幾乎可以肯定有一種方法可以做到這一點,我只需要知道使用哪個屬性類。

+0

不,不是一個選項。如果要控制名稱,請將其粘貼到.idl文件中並使用midl.exe進行編譯。或者只使用你已有的類型庫。 –

回答

2

總之,我相信它可以做到,但並不容易。我幾乎可以確定一個屬性不會像MSDN頁面那樣利用關於前綴輸出type conversion talks的頁面,但沒有提及相關屬性(而頁面的其他部分)。 System.Runtime.InteropServices(與COM相關的屬性存在)中的類列表也沒有任何看似有希望的屬性。

最後,Mauricio Rojas的blog post描述瞭如何通過修改IDL來實現它,但它看起來很醜。 (其他一些博客也有類似的描述。)

相關問題