2011-01-10 13 views
12

Mi è stato chiesto di dare un'occhiata ad un errore in un'applicazione ASP/C# con la sua integrazione con Paypal. L'errore, mostrato in pieno, è:Impossibile caricare il file o l'assembly log4net o una delle sue dipendenze

Impossibile caricare il file o il montaggio 'log4net, Version = 1.2.0.30714, Culture = neutral, PublicKeyToken = b32731d11ce58905' o una delle sue dipendenze. La definizione manifest dell'oggetto ubicata nello non corrisponde al riferimento all'assembly. (Eccezione da HRESULT: 0x80131040)

Da quello che ho capito, questo significa che il file effettivo trova (cioè, log4net.dll nella mia directory bin) non corrisponde alla versione prevista sulla base di alcune configurazioni di montaggio. Il problema che sto avendo è che non riesco a individuare dove viene fatto riferimento a questo file.

Ho accesso a tutti i file nella directory radice Web del sito e non è in grado di individuare alcun file di configurazione che faccia riferimento a questa DLL. In quale altro luogo potrei avere bisogno di cercare di determinare cosa sta causando il mis-match?

Come nota, ho fatto in modo che la versione della DLL nella directory bin sia aggiornata, ma questo non sembra aver risolto nulla.

risposta

9

È necessario controllare i riferimenti anche nei progetti - i riferimenti vengono compilati nell'assieme stesso e tenteranno un caricamento. La mia ipotesi è che si dispone di un riferimento obsoleto all'assembly log4net ma si sta utilizzando la versione più recente.

+0

Questo ha senso. C'è un modo per me di vedere quale riferimento viene fatto nel progetto - quale file si troverà di solito in questo quando si guarda al progetto compilato? – Elie

+0

Non si dovrebbe guardare il progetto compilato, ma quello non compilato, il file csproj. altrimenti, penso che dipenda.exe (nel post di Mark) sarebbe d'aiuto. – Femaref

+0

Questo può essere verificato anche nei pacchetti di nuget. Se uno dei tuoi progetti fa riferimento a log4net versione 1.2.3.4 e gli altri progetti cercano log4net versione 5.6.7.8, quindi si otterrà questo errore. (o qualsiasi altro pacchetto di nuget). Abbina quelle versioni e sei a posto. – Krishna

1

Non ho alcuna informazione utile sull'errore specifico. Tuttavia, nel caso in cui non li abbia usati, un paio di utilità utili per aiutare con questo tipo di problema sono Dependency Walker e .NET Reflector.

Il controllore delle dipendenze può essere utilizzato per verificare se sono presenti moduli imprevisti utilizzati dall'assembly log4net. E l'utilità Reflector mostra tutti i tipi di informazioni utili sugli assiemi (incluse versioni, assiemi di riferimento, per non parlare del codice smontato).

2

Probabilmente hai l'ultima versione di log4net ma hai un progetto che fa riferimento a uno vecchio. È possibile forzare tutti i gruppi che fanno riferimento alla vecchia versione per fare riferimento alla nuova versione utilizzando un <bindingRedirect>

È possibile trovare maggiori informazioni su di loro qui: http://msdn.microsoft.com/en-us/library/eftw1fys.aspx

Se non si conosce la versione specifica per reindirizzare, è possibile utilizzare anche una gamma di versioni e indirizzarle tutte alla versione specifica.

1

Ho anche avuto questo problema e il motivo per cui stava accadendo era che il progetto, per qualche ragione, stava estraendo log4net dal GAC, quindi è abbastanza probabile che la versione in GAC non corrisponda alla versione di riferimento nel tuo progetto

14

Abbiamo avuto questo problema anche quando ci siamo spostati su VS 2010 e .NET 4.0, non usiamo affatto log4net, ma sospetto che qualcos'altro che usiamo sia (forse Crystal Reports?) e sospetto anche c'è una dll che usiamo è una dll a 32 bit pure perché quando cambio l'opzione "Abilita applicazioni a 32 bit" sotto le impostazioni avanzate per il Pool di applicazioni in IIS a "Vero" tutto ha funzionato di nuovo.

+0

Sì, per me è sicuramente dovuto a Crystal Reports. – basher

+0

È divertente. È successo anche a me - chiedendo un riferimento che la mia soluzione non usa affatto. La mia soluzione che "funzionava" è sufficiente riavviare VS2017. E so esattamente che il progetto precedentemente caricato utilizza log4net. Ma la corrente non lo è affatto. Sembra che condividano alcuni file temporanei o smth e che ci sia uno scontro. – Saulius

4

Abbiamo riscontrato un problema simile con la nostra applicazione web. Siamo passati da .NET 1.1 a 32 bit a .NET 4.0 a 64 bit.

L'errore che stavo ricevendo all'interno del nostro uno dei nostri controlli utente è stato il seguente:

ASP.NET runtime error: Could not load file or assembly 'log4net' or one of its dependencies. An attempt was made to load a program with an incorrect format. 

La mia ipotesi è che stiamo compilando una DLL in a 64-bit, ma il suo riferimento a un DLL a 32 bit ? Sarei d'accordo con ciò che Matt Palmerlee ha detto sopra: cambiare il pool di applicazioni in modalità a 32 bit FISCE il problema, ma sei ancora bloccato in un pool di applicazioni a 32 bit. Volevamo sfruttare la memoria extra a 64 bit per offrire i nostri pool di applicazioni IIS.

In definitiva, non ero in grado di capire quale dei terzi DLL è stato effettivamente riferimento a log4net. Ho notato dopo che un log4net.dll è stato copiato nella mia directory "bin" e ho fatto clic su di esso e ho capito che era correlato ad Apache Foundation - http://logging.apache.org/log4net/

Ho finito per scaricare solo l'ultimo log4net.dll per .NET 4, aggiunto come riferimento al mio progetto di applicazione web, ricompilato e quindi riaperto il controllo utente e l'errore è scomparso.

log4net download

Spero che questo aiuti

+0

Ho avuto lo stesso problema. Si stava riferendo a log4net da GAC ​​quindi, i tuoi commenti mi hanno aiutato a risolverlo ... grazie – Munawar

0

stavo andando a seguire il consiglio di Matt per consentire alle applicazioni a 32 bit nelle impostazioni pool di applicazioni IIS.

Risulta che non avevo nemmeno bisogno di andare così lontano, l'errore risolto non appena sono passato a IIS da Cassini.

Per passare a IIS:

  1. Abilita IIS di Windows Programmi e funzionalità (Assicurati di abilitare anche "ASP.NET xx" nodo in IIS> Servizi Web> Caratteristiche lo sviluppo di applicazioni)
  2. In Proprietà progetto> Web> Usa server Web IIS locale> Crea directory virtuale (per eseguire questa operazione è necessario eseguire VS come amministratore).
  3. progetto Costruire> Esegui
  4. errore

No log4net per me dopo questo.

Non so il motivo per cui mi è stato sempre perché non ho nemmeno usare log4net ovunque, ma sono contento che sia andato.

2

Lo stesso errore qui, ecco come abbiamo risolto: il download dell'ultimo .Net 4.0 log4net.dll da Apache e la sostituzione della versione nella cartella bin ha funzionato per me. Dovresti aggiungere il riferimento al tuo progetto per renderlo permanente. Ecco il link: Apache

Vai a Download, binari e scegliere la nuova versione di chiave. Una volta scaricato, accedere alla cartella .Net 4.0 per trovare il file .dll.

0

Dopo aver letto queste risposte ho finito per controllare il .csproj e trovando il riferimento reale per 'Lib \ log4net.dll' nella sezione. Ho cancellato questo e il progetto è stato compilato.

Problemi correlati