2010-08-03 34 views
5

Ho una DLL di interoperabilità che è stata generata da Visual Studio per un oggetto COM di terze parti che sto consumando in una DLL .NET.GAC - L'assembly è nel GAC ma "Impossibile caricare il file o l'assembly"

Ho registrato sia la mia Dll di consumo e la DLL di Interop nel GAC. Devo utilizzare il GAC perché queste DLL vengono utilizzate da un flusso di lavoro di SharePoint 2010.

Quando l'esecuzione arriva al punto in cui la mia dll chiama la DLL di Interop è stato generato il seguente errore "" Impossibile caricare il file o l'assembly "..." Il sistema non è riuscito a trovare il file specificato "insieme alla versione prevista e pubblica chiave.

Se esamino l'Assemblea Fusion Binding Log Viewer, il seguente errore è elencato nella voce di registro della DLL Interop:

LOG: GAC Lookup was unsuccessful. 

Vedo che assembly nella Global Assembly Cache, e ha la versione corretta e token di chiave pubblica come specificato nell'eccezione FileNotFound.

Cosa sta succedendo?

risposta

4

Il problema è che, così come la versione e la chiave pubblica di essere valida, la Architettura del processore della interoperabilità deve corrispondere a quella della vostra vocazione DLL. E, ovviamente, Target Framework deve essere la stessa versione.

La mia DLL è stata compilata nel processore MSIL (Agnostic, AnyCPU), ma per qualche strana ragione Visual Studio ha insistito per compilare Interop su x386.

(Forse questo non causerebbe normalmente un problema, ma il mio server SharePoint è 64 bit, che potrebbe aver causato la comparsa dei sintomi).

La soluzione è quella di compilare l'Interop da soli:

1 - Annullare la registrazione DLL e l'Interop dal GAC.

2 - Avviare il prompt dei comandi di Visual Studio della versione di Visual Studio correlata al framework .NET che la DLL sta utilizzando come target (ovvero stavo sviluppando la mia DLL in Visual Studio 2010, con targeting .NET 3.5. passo Avevo bisogno di avviare il Visual Studio 2008 Command Prompt)

3 - Generare l'Interop utilizzando 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 

il /macchina: Agnostico causa l'interoperabilità da costruire mira il processore Architettura MSIL, che è t lui come mia madre.

4 - Rimuovere il vecchio riferimento alla Interop nel progetto dll

5 - Eliminare il vecchio file di interoperabilità e sostituirlo con quello che avete appena generato (ad esempio, c: \ Interop.CoolThirdParty.dll.)

6 - Aggiungere un riferimento nel progetto alla nuova Interop.

7 - Ricostruire

8 - Registrare la nuova costruzione dll e la nuova Interop nel GAC

E dovrebbe iniziare a lavorare.

0

Speranza oggetto di terze parti COM è anche registrato sulla macchina

2

Chiudere Visual Studio .... eliminare tutte le cartelle da C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files

Questo dovrebbe risolvere il problema ....

0

Ho ricevuto questo per una riga nel mio webconfig in compilation.assemblies che fa riferimento a un assembly che era nel GAC. Il problema era che qualcuno aveva inserito un reindirizzamento dell'assembly nel reindirizzamento web.config dalla versione presente nel GAC a un'altra versione inesistente.

Problemi correlati