2009-08-14 5 views
10

J'ai un assembly géré qui est appelé via COM Interop. Comme un client VBScript, un client Perl, etc.Est-il possible d'exposer un C# Enum aux appelants COM Interop, et si oui, comment?

Les classes sont décorées avec

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

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

Mais il existe également des types enum dans l'assemblage. Je voudrais utiliser des applications COM de noms symboliques, pour les valeurs enum.

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

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

Et puis, comment puis-je référencer ces noms symboliques dans VBScript? Je ne vois pas les types enum dans OleView. (Dois-je?) Je vois tous les autres types dans OleView. VBScript et d'autres clients liés en retard utilisent IDispatch pour appeler des méthodes sur des objets.

Répondre

3

En tant que tel, ces langages n'ont pas accès aux informations de type dans le typelib - ils créent simplement un objet à partir d'un GUID, récupèrent un pointeur IDispatch et commencent à appeler des méthodes par leur nom.

Je ne suis pas sûr de la partie COM Interop de la question, mais même si les énumérations ont montré dans OleView, vous ne seriez pas en mesure de les utiliser directement. Cependant, si vous êtes capable de publier les énumérations dans le typelib, j'ai écrit il y a un outil qui peut générer un fichier de script (vbs ou js) contenant toutes les énumérations d'une typelib comme des constantes.

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

+0

bonne réponse. cet outil semble très utile. – Cheeso

+0

Malheureusement, je n'ai pas de générateur constant pour Perl ... Peut-être qu'il est temps de reprendre le développement :-) –

9

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'avais toute la bibliothèque COM-visible donc

[ComVisible(true)] 

n'était pas nécessaire. Est-ce que votre type enum est public?

Une chose qui est arrivé est que les différentes énumérations sont 'préfixés' avec « type ENUM name'_:

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.

+0

Tous mes enums fonctionnaient bien quand le projet était défini comme ComVisible (vrai), mais comment j'ai pour utiliser l'asm dans un projet VS6 C++, la tlb est trop grande !! J'ai défini l'ensemble du projet comme faux et exposé les classes et enums que je voulais. Les cours sont bien, les enums ne sont pas !! ?? ils sont dans le regsitry (CLSID) comme prévu, mais ne sont tout simplement pas accessibles. Serait très intéressé de savoir pourquoi .. –

+1

Upvoted parce que je ne pouvais pas trouver une explication claire que COM magiquement renomme vos valeurs enum pour les préface avec le nom du type enum, sauf pour ici. –

Questions connexes