2010-07-21 4 views
3

Nous avons un projet qui fait référence à des composants COM + (écrits en VB6). Les composants sont ajoutés à notre solution .Net par 'Ajouter une référence'. Cela fonctionne bien et même intellisense fonctionne.Référence COM + de .Net avec GUID variable

De temps en temps, les interfaces (compatibilité) des composants sont brisées et notre code .Net ne fonctionne plus. Le composant a été ajouté avec un GUID spécifique, ce GUID n'est plus enregistré.

La question: Est-il possible d'appeler les composants COM + de la même manière que nous sommes habitués (pas de réflexion autorisée), sans avoir à mettre à jour les références dans notre solution .Net. Par exemple en créant un wrapper pour le composant COM + sur la base du nom de fichier?

Cordialement, M.

+0

Lorsque vous dites que les interfaces sont brisées, voulez-vous dire qu'ils ont changé? –

+0

Oui, l'interface a été brisée, mais pas sur les classes dont j'ai besoin. Normalement, nous utilisons la compatibilité binaire lors de la compilation des composants VB6. –

Répondre

3

Non, .NET (ainsi que tout programme natif) ne seront pas en mesure d'instancier un composant COM sans connaître le droit GUID. Le meilleur moyen est d'empêcher ce composant de modifier les GUID en premier lieu activer la compatibilité binaire dans le projet de composant et maintenir les interfaces pour rester compatible. Une fois que vous avez rompu la compatibilité des interfaces, vous devrez réajouter le composant à votre programme afin qu'une nouvelle référence valide soit créée. Ce n'est pas parce que .NET est bête, c'est parce qu'une fois que vous avez cassé la compatibilité des interfaces, vous devez recompiler le client.

+0

Je vais choisir ceci comme réponse et je vais résoudre mon problème pour le moment en introduisant un composant supplémentaire entre .Net et le composant cible.De cette façon, la référence reste toujours la même et je n'ai pas besoin de régénérer COM Interop. –

2

Lorsque vous ajoutez une référence à un objet COM, Visual Studio crée automatiquement un «Interop» pour vous. Cet interop est essentiellement une classe wrapper responsable du chargement de l'objet COM et contient des instructions p-invoke pour effectuer les appels de fonction.

Si votre objet COM est en cours de modification, vous pouvez soit ajouter de nouveau la référence chaque fois que l'objet COM est mis à jour, soit générer l'Interop vous-même.

Vous pouvez le faire en utilisant l'outil tlbimp:

TlbImp.exe "MyCOMClass.dll" /out:Interop.MyCOMClass.dll 

Maintenant, si vous ajoutez simplement une référence à la Interop.MyCOMClass.dll au lieu de l'objet COM, puis si le COM ojet changements, vous pouvez simplement régénérer Interop avec l'instruction ci-dessus et le distribuer avec la nouvelle version de l'objet COM.

+0

Et c'est la chose, je ne veux pas régénérer le COM Interop. –

0

C'est la solution: http://support.microsoft.com/kb/161137

  1. Copiez et collez votre compilé VB6 DLL.
  2. Modifiez l'extension en DllName.cmp pour l'exemple
  3. Définissez la compatibilité binaire entre votre DLL et le fichier .cmp.

Le GUID DLL VB6 ne changera pas lorsque vous compilez à nouveau;)

Projet> Propriétés> Compile