2013-07-03 16 views
5

Ho un progetto ASP.NET MVC4 quasi vuoto che fa riferimento a un assembly gestito a 64 bit, che ha un insieme di dipendenze non gestite.Assemblaggio gestito a 64 bit con dipendenze non gestite non caricate in IIS/ASP.NET MVC 4

L'assieme gestito fa riferimento in modo normale ai riferimenti.

Le dipendenze non gestite vengono copiate nella cartella bin in un evento di post-build e sono presenti all'avvio dell'app Web (questo è stato verificato).

Il problema è che ottengo:

Impossibile caricare il file o l'assembly 'Msvcm80.dll' o una delle sue dipendenze. Una routine di inizializzazione della libreria di collegamento dinamico (DLL) non è riuscita. (Eccezione da HRESULT: 0x8007045A)

Questa è una delle dipendenze non gestite. L'elenco completo è:

  • iconv.dll
  • lbm.dll
  • libeay32.dll
  • msvcm80.dll
  • msvcp80.dll
  • msvcr80.dll

La DLL gestita è costruita contro x64 e tutte le dipendenze sono anche x64 (verificate utilizzando Dependency Walker).

Ora ho creato anche un'app per console vuota, un'app per Windows e un Web Api con hosting automatico che contiene lo stesso codice (per l'attivazione di istanze tramite l'assembly gestito) e funzionano tutti (quando si forza il costruire target per essere x64).

Utilizzando Fusion Log (compensazione per primo, poi il caricamento del web app e aggiornare la visualizzatore log), vedo che ci sono problemi di carico:

  • iconv.dll
  • libeay32.dll
  • lbm.dll

Tutti loro hanno i file di log simili:

LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3b2d5b3e/b1b5f1f5/iconv.DLL. 
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3b2d5b3e/b1b5f1f5/iconv/iconv.DLL. 
LOG: Attempting download of new URL file:///C:/.../bin/iconv.DLL. 
LOG: Assembly download was successful. Attempting setup of file: C:\...\bin\iconv.dll 
LOG: Entering download cache setup phase. 
ERR: Error extracting manifest import from file (hr = 0x80131018). 
ERR: Setup failed with hr = 0x80131018. 
ERR: Failed to complete setup of assembly (hr = 0x80131018). Probing terminated. 

Quindi, in realtà, si deduce che le dipendenze si trovano nella cartella bin locale, ma non è possibile utilizzarle per qualche motivo.

Che cosa significa l'errore "Errore durante l'estrazione di manifest dal file (hr = 0x80131018)." significare?

Le dipendenze non sono in GAC e non sono registrate utilizzando regsvr32 (non COM).

Ciò che mi indovina è che funziona bene al di fuori di IIS (ho anche provato a configurare le credenziali nel pool di app come le credenziali della rete locale - il che non ha fatto la differenza, ovviamente).

Qualche buona idea su come eseguire il debug di questo problema?

EDIT: sono ora in grado di eseguire il sito ASP.NET sulla mia macchina di sviluppo locale, ma non quando viene distribuito su un altro server.

La "correzione" per il mio computer locale, era rimuovere il msvcm80.dll (runtime C) dalla directory bin. L'assembly è (probabilmente) ancora necessario, ma viene cercato da qualche altra parte (presumibilmente perché ho la versione "corretta" di CRT (distribuibile) installata in WinSxS).

Scavando in questo, vedo che l'assembly gestito è presumibilmente dipendente da msvcm80.dll versione 8.00.50727.6195 (x64), ma quella particolare versione non è installata sul mio sistema locale (l'ho solo in una cartella delle dipendenze) - ma ne ho uno più nuovo in WinSxs (8.00.50727.6910).

Quindi qual è il rilevamento di IIS quando non lo si aggiunge direttamente nella cartella bin?

2 ° EDIT: modo che appaia come lbm.dll ha una dipendenza diretta a Msvcr80.dll, ma ha anche una dipendenza per iconv.dll, che ha di nuovo una dipendenza a Msvcr80.dll. Tuttavia, secondo Dependency Walker (depends.exe), queste due dipendenze non vengono risolte dalla stessa directory (anche quando hanno la stessa versione!).

Se mi assicuro che la dipendenza indiretta sia nella variabile di ambiente PATH e la seconda dipendenza sia in WinSxS, funziona. Questo ovviamente non è abbastanza buono, ma non riesco a capire come applicare la dipendenza diretta e indiretta da una singola posizione/file.

risposta

3

Utilizzando uno strumento come Dependency Walker troverete che lbm.dll e le sue dipendenze dipendono solo msvcr80.dll e non msvcp80.dll e msvcm80.dll anche se questi due file sono inclusi nel Microsoft.VC80.CRT.manifest usato da lbm.dll per caricare la versione corretta del Visual C++ 2005 runtime biblioteca.

La rimozione di msvcp80.dll e msvcm80.dll dalla cartella bin deve risolvere il problema.

+2

Grazie, Martin, è giusto. Un'ultima cosa è necessaria per farlo funzionare in IIS - disabilitare la copia shadow degli assiemi. Se è abilitato, le dipendenze non vengono copiate ulteriormente nella dir della copia shadow. Questo può essere fatto inserendolo in web.config (sotto ): cwt237