2008-12-15 13 views
11

J'ai un assembly .NET que j'ai exposé à COM via un fichier tlb, et un installateur qui enregistre le tlb. J'ai vérifié manuellement que le programme d'installation fonctionne correctement et que les clients COM peuvent accéder à la bibliothèque. Jusqu'ici, tout va bien ...Est-il possible de tester un assembly exposé COM à partir de .NET?

Cependant, j'essaie de mettre en place des tests système automatisés qui vérifient que le programme d'installation fonctionne correctement. Dans le cadre de cela, j'ai automatisé l'installation sur une machine virtuelle, et je veux maintenant faire quelques appels à la bibliothèque COM installée pour vérifier qu'il fonctionne correctement. J'ai d'abord pensé écrire des tests en VB6, mais j'ai déjà une grande suite de tests écrits en C#, qui font référence à l'assemblage .NET. J'espérais que je pourrais les modifier pour référencer le .tlb, mais j'obtiens une erreur quand j'essaye cela dans VS2008:

La bibliothèque de type ActiveX 'blah.tlb' a été exportée depuis un assembly .NET et ne peut pas être ajoutée pour référence.

Y at-il un moyen de tromper VS2008 en me permettant d'ajouter cette référence, peut-être en modifiant le fichier tlb?

Google n'a trouvé aucune solution. Tout ce que j'ai trouvé est un article Microsoft Connect indiquant que ceci est « By Design »: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=120882

+0

Quelques personnes ont mentionné l'utilisation de tlbimp.exe. Si j'essaye tlbimp.exe blah.tlb j'obtiens l'erreur: "La bibliothèque de type a été exportée d'un assembly CLR et ne peut pas être ré-importée comme un assembly CLR." – Akash

Répondre

12

Le plus proche que j'ai de trouver une solution quelque chose comme le suivant:

using System; 
class ComClass 
{ 
    public bool CallFunction(arg1, arg2) 
    { 
     Type ComType; 
     object ComObject; 

     ComType = Type.GetTypeFromProgID("Registered.ComClass"); 
     // Create an instance of your COM Registered Object. 
     ComObject = Activator.CreateInstance(ComType); 

     object[] args = new object[2]; 
     args[0] = arg1; 
     args[1] = arg2; 

     // Call the Method and cast return to whatever it should be. 
     return (bool)ComType.InvokeMember("MethodToCall", BindingFlags.InvokeMethod, null, ComObject, args)) 
    } 
} 

Ce n'est pas très joli, mais je pense que le message est clair. Vous pouvez bien sûr placer l'instanciation ComObject dans un constructeur et envelopper le reste des appels vers l'objet, mais probablement pas nécessaire pour le code de test.

+0

+1 pour la méthode Type.GetTypeFromProgID, il peut obtenir COM type. J'ai essayé ceci, cela fonctionne (mais y a-t-il une différence pratique à ajouter directement une référence? Je ne sais pas). – peenut

+0

'methodCOM' dans l'exemple devrait en fait être la variable' ComType'. – glebd

-1

En utilisant tlbimp.exe vous pouvez générer un assemblage à partir de votre composant COM qui peut être utilisé dans le code .NET

+2

Pas si le composant COM a été créé en langage C# ou autre langage .NET –

+2

-1 raison même que le commentaire: Pas si le composant COM a été créé en C# ou autre langage .NET – peenut

0

Vous devriez être capable de créer une classe wrapper à votre composant COM installé en utilisant TLBImp, puis exécutez vos tests par rapport à cela. Vous écrirez essentiellement un assembly .Net, en l'installant sur COM puis en le testant sur la classe wrapper afin que vos tests soient routés comme s'ils étaient appelés par un composant COM.