web-dev-qa-db-fra.com

Qu'est-ce que la DLL d'interopérabilité?

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

À ma connaissance, la DLL d'interopérabilité est là en tant qu'intermédiaire afin que mon code .net puisse parler à la DLL Reportwriter.

Alors, est-ce que j'enregistre la DLL d'interopérabilité ou est-ce que j'enregistre la DLL d'origine?

52
Prabu

Lorsque vous écrivez du code dans VB6, le résultat compilé est un composant COM. Les composants COM fournissent des interfaces, des coclasses, des structures et des énumérations, qui sont normalement décrites à 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 (car il ne peut pas fonctionner directement avec les bibliothèques de types). Un assemblage d'interopérabilité n'est donc qu'une bibliothèque de types COM "convertie", en ce sens qu'il contient des descriptions d'interfaces, de structures, etc. qui correspondent aux mêmes choses dans une bibliothèque de types.

(Ce qui précède est quelque peu simplifié, car l'assemblage d'interopérabilité ne doit pas être produit à partir d'une bibliothèque de types - vous pouvez en coder manuellement une si vous le souhaitez, par exemple.)

Contrairement à ce qui est souvent dit, un assembly d'interopérabilité ne contient aucun code exécutable et ne fait aucun marshaling. Il ne contient que des définitions de types, et le seul endroit où il peut avoir des méthodes est dans les interfaces, et les méthodes dans les interfaces n'ont pas d'implémentation. Le marshaling des appels .NET vers ceux COM est en fait effectué par CLR lui-même sur la base des descriptions de type chargées à partir des assemblys interop - il génère tout le code nécessaire à la volée.

Maintenant, pour votre question. Vous devez enregistrer votre projet COM DLL (la sortie de votre VB6) - par exemple, en utilisant regsvr32.exe. Vous ne devriez pas (en fait, vous ne pouvez pas) enregistrer un assembly d'interopérabilité de cette façon, car ce n'est pas un composant COM - c'est juste un assembly .NET simple, vous pouvez donc le placer dans le même dossier avec votre .exe/.dll , ou mettez-le dans GAC, comme d'habitude.

92
Pavel Minaev

Bonne réponse de Pavel. De plus, à partir de la version 4 de .NET Framework, vous n'avez pas besoin de déployer l'assembly d'interopérabilité avec votre application - http://msdn.Microsoft.com/en-us/library/tc0204w0.aspx

7
resnyanskiy

Vous avez raison. L'interop DLL encapsule les appels au composant VB6 et les rend transparents.

Lors de l'enregistrement des DLL sur la machine sur laquelle vous exécuterez l'application, vous devez toujours enregistrer la DLL VB6. L'interop DLL placera le dossier bin de votre application et marshalera les appels.

2
Justin Niessner

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

2
Rubens Farias