2010-08-03 4 views
5

J'ai une DLL Interop qui a été générée par Visual Studio pour un objet COM tiers que je consomme dans une DLL .NET.GAC - L'assembly est dans le GAC mais "Impossible de charger le fichier ou l'assembly"

J'ai enregistré à la fois ma DLL consommatrice et la DLL Interop dans le GAC. Je dois utiliser le GAC parce que ces DLL sont utilisées par un flux de travail SharePoint 2010. Lorsque l'exécution arrive au point où ma DLL appelle la DLL Interop l'erreur suivante a été levée "" Impossible de charger le fichier ou l'assembly "..." Le système n'a pas pu trouver le fichier spécifié "avec la version attendue et publique clé.

Si j'examine l'Assemblée Fusion Binding Log Viewer, l'erreur suivante est listé dans l'entrée du journal de la dll Interop:

LOG: GAC Lookup was unsuccessful. 

Je peux voir que l'assemblage dans le GAC, et il a la version correcte et jeton de clé publique tel que spécifié dans l'exception FileNotFound.

Que se passe-t-il?

Répondre

4

Le problème est que, ainsi que la version et la clé publique étant valide, l'architecture du processeur de l'Interop doit correspondre à celui de votre appel DLL Et, bien sûr, le Framework cible doit être la même version.

Ma DLL a été compilée au processeur MSIL (Agnostic, AnyCPU), mais pour une raison étrange, Visual Studio a insisté sur la compilation de l'Interop en x386.

(Peut-être que cela ne poserait normalement pas de problème, mais mon serveur SharePoint est en 64 bits, ce qui peut avoir provoqué l'apparition des symptômes).

La solution est de compiler l'Interop vous:

1 - Unregister votre dll et l'Interop du GAC.

2 - Démarrez la commande Visual Studio Invite de la version Visual Studio qui se rapporte au framework .NET votre dll vise (c.-je développais mon dll dans Visual Studio 2010, en ciblant .NET 3.5 Pour ce faire. étape je avais besoin pour démarrer le Visual studio 2008 Invite de commandes)

3 - Générer l'Interop en utilisant Tlbmp

tlbimp <full path and filename of COM .tlb> /out:c:\.\Interop.CoolThirdParty.dll /keyfile: <full path and filename of snk> /machine:Agnostic /Namespace:CoolThirdParty 

la /machine: Agnostique provoque l'Interop à construire ciblant l'architecture du processeur MSIL, qui est t il est le même que mon dll.

4 - Retirez l'ancienne référence à l'Interop dans votre projet dll

5 - Supprimez l'ancien fichier Interop et le remplacer par celui que vous venez de produit (par exemple c: \ Interop.CoolThirdParty.dll.

6 - Ajoutez une référence dans votre projet au nouvel Interop.

7 - Reconstruire

8 - Enregistrez votre nouvellement construit dll et le nouveau Interop dans le GAC

Il devrait commencer à travailler.

0

espère que votre objet COM tiers est également enregistré sur la machine

2

Fermer Visual Studio .... supprimer tous les dossiers de C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files

Cela devrait résoudre votre problème ....

0

Je l'ai reçu pour une ligne dans mon webconfig dans compilation.assembles référençant un assembly qui était dans le GAC. Le problème était que quelqu'un avait mis une redirection d'assembly dans le web.config redirigeant de la version qui était dans le GAC à une autre version inexistante.