¿Es posible exponer un C # Enumeración de las personas que llaman de interoperabilidad COM, y si es así, ¿cómo?

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

Pregunta

Tengo un ensamblado administrado que es llamada a través de interoperabilidad COM. Al igual que un cliente VBScript, Perl un cliente, y así sucesivamente.

Las clases están decoradas con

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

A continuación, por supuesto que sí lo regasm, y todos los métodos funcionan muy bien.

Pero también hay tipos de enumeración del conjunto. Me gustaría utilizar aplicaciones COM nombres simbólicos, de los valores de enumeración.

¿Cómo exponer el enumeraciones a través de interoperabilidad COM? No sólo hay que añadir estos atributos?

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

Y entonces, ¿Cómo me refiero esos nombres simbólicos en VBScript? No veo los tipos de enumeración en Oleview. (Debería?) Veo a todos los otros tipos de Oleview.

¿Fue útil?

Solución

VBScript y otros clientes de enlace en tiempo IDispatch utilizan para llamar a métodos en los objetos. Como tal, estas lenguas no tienen acceso para escribir información en la biblioteca de tipos -. Que acaba de crear un objeto desde un GUID, obtienen un puntero IDispatch espalda, y empieza a llamar por su nombre métodos

No estoy seguro de la parte de interoperabilidad COM de la cuestión, pero incluso si las enumeraciones sí mostraron en Oleview, no sería capaz de utilizar directamente.

Sin embargo, si usted es capaz de publicar las enumeraciones en la biblioteca de tipos, escribí una herramienta hace miles de años que pueden generar un archivo de script (VBS o JS) que contienen todas las enumeraciones de una biblioteca de tipos como constantes.

Vea aquí: http://www.kontrollbehov.com/tools/tlb2const/

Otros consejos

Mi (hasta ahora sólo) NET que hice COM-visible también tenía un tipo de enumeración, que se presentó muy bien en Oleview. Tenía toda la biblioteca sea visible para COM-

[ComVisible(true)]

no era necesario. Es el tipo de enumeración público?

Una cosa que ocurrió fue que los diferentes enumeraciones fueron 'el prefijo' con 'nombre de tipo de enumeración' _:

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

convertido en:

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

en la biblioteca de tipos.

Sé que esto es un hilo muy antiguo, pero voy a añadir mis 2 centavos para los futuros exploradores. Cuando defino una enumeración en C # que se adorna con [Guid (...), ComVisible (true)] no GuidAttribute.
Por ejemplo:

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

A continuación, la enumeración estaría disponible en VB6 como myEnum_first, myEnum_second y así sucesivamente.

Puede incluir la asignación de valores clave en esa lista también, así que primero = 1 sería válida en la enumeración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top