Question

J'ai un assembly managé qui est appelé via COM Interop. Comme un client VBScript, un client Perl, et ainsi de suite.

Les classes sont décorées avec

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

Alors je fais bien sûr la chose regasm, et toutes les méthodes fonctionnent très bien.

Mais il y a aussi des types ENUM dans l'assemblage. Je voudrais utiliser des noms symboliques applications COM, pour les valeurs ENUM.

Comment puis-je exposer les énumérations via COM interop? Ai-je besoin d'ajouter que ces attributs?

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

Et puis, comment puis-je référence les noms symboliques dans VBScript? Je ne vois pas les types de ENUM dans OleView. (Dois-je?) Je vois tous les autres types de OleView.

Était-ce utile?

La solution

VBScript et d'autres clients en retard lié utilisent IDispatch pour appeler des méthodes sur les objets. À ce titre, ces langues n'ont pas accès à des informations de type dans la typelib -. Ils ont juste créer un objet à partir d'un GUID, obtenir un pointeur IDispatch arrière et commencer à appeler des méthodes par nom

Je ne suis pas sûr de la partie COM Interop de la question, mais même si les énumérations ont bien montré dans OleView, vous ne seriez pas en mesure de les utiliser directement.

Cependant, si vous êtes en mesure de publier les énumérations dans le typelib, j'ai écrit il y a des éons d'outils qui peuvent générer un fichier de script (VBS ou js) contenant toutes les énumérations d'un typelib comme des constantes.

Voir ici: http://www.kontrollbehov.com/tools/tlb2const/

Autres conseils

Mon (jusqu'à présent uniquement) assembly .NET que j'ai fait COM visible avait aussi un type ENUM, qui est apparu très bien dans OleView. J'ai eu toute la bibliothèque COM soit visible si

[ComVisible(true)]

n'a pas été nécessaire. Est-ce votre public type ENUM?

Une chose qui est arrivé est que les différentes énumérations sont « préfixés » par « nom de type ENUM » _:

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

transformé en:

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

dans la bibliothèque de type.

Je sais que c'est un fil très vieux, mais je vais ajouter mes 2 cents pour les futurs explorateurs. Lorsque je définis un ENUM en C # Je décore avec [Guid (...), ComVisible (true)] ne GuidAttribute.
Par exemple:

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

Ensuite, l'énumération serait disponible en VB6 comme myEnum_first, myEnum_second et ainsi de suite.

Vous pouvez inclure l'attribution des valeurs clés dans cette liste et, donc d'abord = 1 serait valable dans l'énumération.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top