52 votes

Qu'est-ce que la dll interop ?

J'ai besoin d'une clarification. J'ai une dll Reportwriter qui utilise Crystal Reports. Elle est écrite en VB6. Je dois ajouter cette dll à mon projet asp.net, où elle crée une dll d'interopérabilité.

D'après ce que j'ai compris, la dll interop est là comme intermédiaire pour que mon code .net puisse parler à la dll Reportwriter.

Alors, dois-je enregistrer la dll interop ou la dll originale ?

92voto

Pavel Minaev Points 60647

Lorsque vous écrivez du code en VB6, le résultat compilé est un composant COM. Les composants COM fournissent des interfaces, des coclasses, des structs et des enums, qui sont normalement décrits à l'aide d'une bibliothèque de types COM. Cependant, pour consommer ce composant COM dans .NET, vous avez besoin d'une description de type dans un format que .NET comprend, c'est-à-dire un assemblage .NET (puisqu'il ne peut pas travailler directement avec les bibliothèques de types). Un assemblage interop n'est donc qu'une bibliothèque de types COM "convertie", dans le sens où il contient des descriptions d'interfaces, de structures, etc. qui correspondent aux mêmes éléments dans une bibliothèque de types.

(Ce qui précède est quelque peu simplifié, car l'assemblage interop n'est pas ont à produire à partir d'une bibliothèque de types - vous pouvez en coder un à la main si vous le souhaitez, par exemple).

Contrairement à ce qui est souvent dit, une assembly interop ne contient aucun code exécutable et ne fait aucun marshalling. Elle ne contient que des définitions de type, et le seul endroit où elle peut avoir des méthodes est dans les interfaces, et les méthodes dans les interfaces n'ont pas d'implémentation. La mise en correspondance des appels .NET avec les appels COM est en fait effectuée par le CLR lui-même sur la base des descriptions de type chargées à partir des assemblages interop - il génère tout le code nécessaire à la volée.

Maintenant, pour répondre à votre question. Vous devez enregistrer votre DLL COM (la sortie de votre projet VB6) - par exemple, en utilisant regsvr32.exe . Vous ne devriez pas (en fait, vous ne pouvez pas) enregistrer un assemblage interop de cette façon, car il ne s'agit pas d'un composant COM - c'est juste un assemblage .NET ordinaire, donc vous pouvez soit le mettre dans le même dossier que votre .exe/.dll, soit le mettre dans le GAC, comme d'habitude.

7voto

resnyanskiy Points 478

Bonne réponse de Pavel. En outre, à partir de la version 4 de .NET Framework, il n'est pas nécessaire de déployer l'assemblage interop avec votre application. http://msdn.microsoft.com/en-us/library/tc0204w0.aspx

2voto

Justin Niessner Points 144953

Vous avez raison. La DLL d'interopérabilité enveloppe les appels au composant VB6 et les rend transparents.

Lorsque vous enregistrez les DLL sur la machine sur laquelle vous allez exécuter l'application, vous devez encore enregistrer la DLL VB6. La DLL d'interopérabilité s'installera dans le dossier bin de votre application et marshalera les appels.

2voto

Rubens Farias Points 33357

Vous devriez enregistrer votre dll VB6 et la référencer dans votre projet .NET ; cette référence créera votre Interop.dll

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X