2010-08-23 24 views
3

J'ai une DLL propriétaire très ancienne (VC++ 5.0) que je dois utiliser depuis C# (Visual Studio 2010). L'exemple spécifie que pour accéder à ce composant j'ai besoin d'appeler CreateDispatch("application") qui indique vers OLE.Appel d'un ancien composant OLE à partir de C#

Voici l'exemple de code (C++):

IComponentServer Server; 
Server.CreateDispatch("Component.Server"); 

J'ai ajouté une référence dans Visual Studio au fichier TLB je l'ai, et je peux importer son espace de noms avec succès, mais IComponentServer n'a pas de méthode appelé CreateDispatch.

Quelle est la bonne approche pour créer l'instance d'un composant OLE via C#?

Répondre

3

Si vous avez soit le CLSID ou ProgID vous pouvez utiliser l'ensemble des méthodes suivantes.

var type = Type.GetTypeFromProgID(progIdString); 
var obj = Activator.CreateInstance(type); 
var server = (IComponentServer)obj; 
+0

Merci JaredPar. Une idée de pourquoi je pourrais obtenir une exception InvalidCastException avec le code que vous avez fourni? Cette opération a échoué car l'appel QueryInterface sur le composant COM pour l'interface avec le IID '{BAA135B2-F931-11D0-9C14-0060973155F0}' a échoué en raison de l'erreur suivante: Aucune interface prise en charge (Exception de HRESULT: 0x80004002 (E_NOINTERFACE)). – jbx

+0

@jbx, la cause la plus probable est que les bibliothèques de types pour l'assembly COM ne sont pas enregistrées correctement. – JaredPar

+0

J'ai essayé regasm qui a échoué en disant que ce n'est pas un assembly .Net valide (à vrai dire, c'est une ancienne bibliothèque de l'âge de VC++ 5.0) J'ai essayé regtlibv12.exe qui a déclaré qu'il a enregistré le TLB avec succès. Cependant même problème. Des idées que je pourrais faire? – jbx

1

Le MFC CreateDispatch crée des objets COM basés sur une chaîne CLSID ou ProgId. Vous pouvez instancier des objets COM directement à partir du code C#.

En supposant que la référence Visual Studio vous donne Interop.Component.dll:

IComponentServer server = new Interop.Component.ServerClass(); 
+1

Peut ne pas fonctionner, le code MFC utilisait l'interface IDispatch à liaison tardive. Pas si facile à faire en C#, sauf si l'OP utilise la version 4.0 et peut tirer parti de * dynamic *. Un petit adaptateur écrit en VB.NET serait une option. –

+0

Cela peut être la seule option - selon la réponse de @ JaredPar, la bibliothèque de type ne semble pas trop belle. –

+0

Pouvez-vous expliquer d'où vient le paquet Interop? Un peu perdu ici avec ça. – jbx