2009-07-01 8 views
1

Nous envisageons d'exposer certains types C# aux clients C++ via COM. Quels problèmes pouvons-nous espérer atteindre au cours de la vie du projet? Par exemple. Comment sera géré le versioning?Exposition de C# via COM pour le client C++

Sur la version, il semblerait de lire this que nous devrions décorer nos types à exposer avec [ClassInterface(ClassInterfaceType.None)] et utiliser une interface explicite. De cette façon, je suppose que nous contrôlons entièrement l'interface qui sera exposée aux clients COM.

Merci d'avance.

Répondre

2

Étant donné que vous utilisez un client C++, vous devez absolument utiliser des interfaces explicites pour une liaison anticipée. Les interfaces Dispatch sont utiles lors de l'utilisation de clients de script tels que VBS, mais elles sont rarement utiles pour les clients C++. La seule façon de versionner une interface est de créer une nouvelle interface (héritant peut-être de l'interface d'origine). Lorsque vous utilisez des interfaces explicites, vous avez un contrôle total sur ce processus. Cela signifie que vous devez créer une interface pour chaque classe que vous avez l'intention d'exposer via COM. N'oubliez pas de marquer chaque interface et classe avec les attributs ComVisible et Guid. De plus, toutes vos classes doivent avoir un constructeur par défaut.

+0

Seules les classes qu'il veut instancier avec CoCreateInstance doivent avoir des constructeurs par défaut et être exposées à COM. S'il veut seulement une méthode d'usine quelque part la classe implémentant l'interface n'a pas besoin d'être COM exposée et avoir un constructeur par défaut. – sharptooth

+0

Où vivrait la méthode d'usine? – ng5000

+0

Je veux dire que vous pourriez avoir plusieurs classes exposées qui auront plusieurs méthodes factory ou retrieveal retournant certaines interfaces non liées à ces classes. Ces classes doivent être exposées, mais pas les classes qui implémentent ces interfaces retournées. – sharptooth

1

Pour obtenir un contrôle total sur les interfaces COM, définissez-les dans MIDL. Construire une bibliothèque de types avec ces interfaces dans un projet C++, puis importer la bibliothèque de types en C# et implémenter les interfaces.

Cette approche est utile avec les interfaces complexes où le marshaling n'est pas trivial.

Les versions doivent être de style COM, en modifiant les GUID et en ajoutant des interfaces nouvelles ou héritantes.