Domanda

Ho un assembly gestito che viene chiamato tramite COM Interop. Come un client VBScript, un client Perl, e così via.

Le classi sono decorate con

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

Poi, naturalmente, faccio la cosa regasm, e tutti i metodi funzionano bene.

Ma ci sono anche tipi enum nell'assieme. Mi piacerebbe usare simbolici applicazioni nomi COM, per i valori enum.

Come faccio a esporre l'enumerazioni tramite interoperabilità COM? Ho solo bisogno di aggiungere questi attributi?

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

E poi, come faccio fanno riferimento a tali nomi simbolici in VBScript? Non vedo i tipi enum in OleView. (Dovrei?) Vedo tutti gli altri tipi di OleView.

È stato utile?

Soluzione

VBScript e altri client tardiva utilizzano IDispatch chiamare metodi su oggetti. In quanto tale, nelle lingue non hanno accesso di digitare le informazioni nella libreria dei tipi -. Semplicemente creare un oggetto da un GUID, ottenere il puntatore indietro un IDispatch, e iniziare a chiamare i metodi per nome

Non sono sicuro della parte di interoperabilità COM della questione, ma anche se le enumerazioni hanno mostrato in OleView, non sarei in grado di utilizzare direttamente.

Tuttavia, se si è in grado di pubblicare le enumerazioni nella libreria dei tipi, ho scritto uno strumento di eoni fa, che possono generare un file di script (VBS o JS) che contengono tutte le enumerazioni da una libreria dei tipi come costanti.

Vedi qui: http://www.kontrollbehov.com/tools/tlb2const/

Altri suggerimenti

Il mio (finora solo) assembly .NET che ho fatto COM-visibile ha avuto anche un tipo enum, che si presentò bene in OleView. Ho avuto l'intera libreria essere COM-visibile in modo

[ComVisible(true)]

non era necessario. È il tuo tipo enum pubblico?

Una cosa che è successo è che le diverse enumerazioni sono stati 'prefisso' con 'enum nome del tipo' _:

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

trasformato in:

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

nella libreria dei tipi.

So che questo è un filo molto vecchio, ma io aggiungo i miei 2 centesimi per i futuri esploratori. Quando mi definisco un enum in C # ho decorare con [Guid (...), ComVisible (true)] non GuidAttribute.
Ad esempio:

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

Poi l'enumerazione sarebbe disponibile in VB6 come myEnum_first, myEnum_second e così via.

È possibile includere l'assegnazione di valori chiave in tale elenco e, in modo first = 1 sarebbe valido l'enumerazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top