Можно ли предоставить C# Enum вызывающим сторонам COM Interop, и если да, то как?

StackOverflow https://stackoverflow.com/questions/1276442

Вопрос

У меня есть управляемая сборка, которая вызывается через COM Interop.Например, клиент VBScript, клиент Perl и т. д.

Классы украшены

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

Затем, конечно, я делаю регазм, и все методы работают нормально.

Но в сборке есть и перечислимые типы.Я хотел бы использовать символические имена COM-приложений для значений перечисления.

Как предоставить перечисления через COM-взаимодействие?Нужно ли мне просто добавить эти атрибуты?

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

И потом, как мне ссылаться на эти символические имена в VBScript?Я не вижу типы перечислений в OleView.(Должен ли я?) Все остальные типы я вижу в OleView.

Это было полезно?

Решение

VBScript и другие клиенты с поздним связыванием используют IDispatch для вызова методов объектов.Таким образом, эти языки не имеют доступа к информации о типах в библиотеке типов — они просто создают объект из GUID, получают обратно указатель IDispatch и начинают вызывать методы по имени.

Я не уверен в части вопроса, связанной с COM-взаимодействием, но даже если перечисления действительно отображаются в OleView, вы не сможете использовать их напрямую.

Однако, если вы можете публиковать перечисления в библиотеке типов, много лет назад я написал инструмент, который может сгенерировать файл сценария (vbs или js), содержащий все перечисления из библиотеки типов в качестве констант.

Глянь сюда: http://www.kontrollbehov.com/tools/tlb2const/

Другие советы

Моя (пока единственная) сборка .NET, которую я сделал COM-видимой, также имела тип перечисления, который прекрасно отображался в OleView.Я сделал всю библиотеку видимой для COM, поэтому

[ComVisible(true)]

не было необходимости.Является ли ваш тип перечисления общедоступным?

Одна вещь, которая произошла, заключалась в том, что различные перечисления имели «префикс» с «именем типа перечисления»_:

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

превратился в:

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

в библиотеке типов.

Я знаю, что это очень старая тема, но я добавлю свои 2 цента для будущих исследователей.Когда я определяю перечисление в C#, я украшаю его [Guid(...), ComVisible(true)], а не GuidAttribute.
Например:

[Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
public enum myEnum
{
    first,
    second,
    third,
    fourth
}

Тогда перечисление будет доступно в VB6 как myEnum_first, myEnum_ Second и т. д.

Вы также можете включить присвоение значений ключей в этот список, поэтому в перечислении будет допустимым значение first = 1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top