Можно ли указать имя поля перечисления COM с помощью атрибута? - PullRequest
2 голосов
/ 15 июля 2011

Я заменяю (часть) библиотеки Delphi COM библиотеку .net. Я перенес несколько COM-интерфейсов и перечислений в сборку .net. Все хорошо, за исключением того, что перечисления экспортируются в библиотеку типов с использованием соглашения об именовании {enum_type_name} _ {enum_value_name}.

Пример

[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
}

Я почти уверен, что есть способ сделать это, мне просто нужно знать, какой класс атрибутов использовать.

1 Ответ

2 голосов
/ 15 июля 2011

Короче говоря, я верю, что это можно сделать, но это нелегко.Я почти уверен, что атрибут не сработает, поскольку страница MSDN на экспортированном преобразовании типов говорит о префиксе, но не упоминает связанные атрибуты (тогда как другие части страницы это делают).Список классов в System.Runtime.InteropServices (где живут атрибуты, связанные с COM) также не имеет каких-либо перспективных атрибутов.

Наконец, сообщение в блоге Маурисио Рохас описывает, как это сделать, изменив IDL, но это выглядит ужасно.(Несколько других блогов имеют похожие описания.)

...