2012-03-22 23 views
32

Aggiunto di recente log4net.dll al nostro oggetto dati. Il nostro oggetto di dati costruisce perfettamente, ma quando si tenta di costruire qualcosa che fa riferimento i nostri dati oggetto si ottiene il seguente errore:Come risolvere "Nessun modo per risolvere conflitti tra" errore?

No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily.

ho trovato la seguente thread che mi ha permesso di ottenere ulteriori informazioni sul problema.

log4net è utilizzato per una varietà di cose nel nostro progetto. Ad esempio, crystal installato 1.2.9 nel GAC. So che gli infragicci usano 1.2.10.

Abbiamo una directory specifica - chiamiamola c:\references - dove costruiamo tutte le nostre DLL e che tutte le nostre applicazioni utilizzano per fare riferimento alle nostre DLL interne. Così ho impostato in modo specifico il mio riferimento nel nostro oggetto dati a c: \ references \ log4net.dll che è la versione 1.2.11. Il che è strano perché nel messaggio di errore sopra non vedi 1.2.11. La DLL è referenziata con la versione specifica: = True & Copia locale: = True. Ho controllato la directory di build & 1.2.11 di log4net è stato spostato correttamente.

Se aiuta qui ci sono alcuni dei messaggi di errore dettagliati:

There was a conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". 
    No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily. 
     References which depend on "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" [C:\Windows\assembly\GAC_32\log4net\1.2.10.0__692fbea5521e1304\log4net.dll]. 
      C:\Windows\assembly\GAC_MSIL\CrystalDecisions.Shared\13.0.2000.0__692fbea5521e1304\CrystalDecisions.Shared.dll 

    References which depend on "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905" [C:\Program Files (x86)\Business Objects\Common\4.0\managed\log4net.dll].   c:\references\DBObjectAdoNet.dll 
      Project file item includes which caused reference "c:\references\DBObjectAdoNet.dll". 

Aggiornamento: Finora l'unico modo che ho trovato per correggere l'errore è quello di riferimento log4net in nulla riferimento DBObjectAdoNet.dll. Questa non è davvero una soluzione utilizzabile dal momento che quasi lo utilizza tutto il nostro intero sistema.

2nd Update: Ho provato a inserire log4net nel GAC pensando che avrebbe risolto il problema, ma non ci sono riuscito.

3 ° aggiornamento: ho effettuato una chiamata di supporto a Microsoft. Vogliono che io usi Assembly.LoadFrom() che sono molto, molto titubante, dato che eseguiamo più di 300.000 chiamate in un'applicazione e che richiederebbero una riflessione per ogni chiamata che rallenterebbe un po 'le cose.

Ho scoperto che se disinstalla il runtime di cristallo sulla mia macchina l'errore scompare che non ha molto senso perché l'unica cosa che fa, per quanto ne so, è rimuovere log4net 1.2.10.0 da il GAC sotto le cartelle .NET Framework 2.0, che non dovrebbe avere importanza perché l'app è un'app .NET framework 4.

+0

'quote' Ho scoperto se disinstalla il runtime di cristallo sulla mia macchina'/quote' - domanda: ** runtime di cristallo **? Cosa ** crystal runtime **? –

+0

@Robert Crystal 11 x86 per .Net Framework 4. Penso che quando ho avuto il problema la stessa cosa è successa anche con la versione x64. – coding4fun

+0

Ho aggiunto un riferimento alla versione di log4net che volevo nel progetto che non è stato in grado di risolvere il conflitto e questo ha risolto il problema. –

risposta

2

Abbiamo scoperto che il runtime di cristallo era sicuramente il problema. Se disinstalliamo log4net su %windir%\assembly installato in Crystal Crystal, il messaggio di avviso scompare. La cosa strana è che se installo log4net 1.2.10 dal sito di log4net nel GAC, il messaggio di avviso non riappare. Se qualcuno può spiegarlo, per favore aggiungi a questo thread. Crystal ha firmato log4net con la propria chiave del nome (il token della chiave pubblica è diverso).

La chiave per risolvere il problema di log4net è che log4net è un progetto open source.Il che significa che possiamo semplicemente costruire la DLL dal sorgente con un nome diverso. Non l'ho ancora provato ma dovrebbe risolvere il problema. Avremo il passo in più di costruire dalla sorgente ogni volta che vogliamo aggiornare log4net, ma considerando quanto stiamo andando ad aggiornare la DLL non è un grosso problema.

+6

Abbiamo provato questo approccio con risultati disastrosi. Il CLR caricò volentieri entrambi gli assembly, ma non riuscì a risolvere ILog che esisteva in entrambi. Di conseguenza, abbiamo perso metà della nostra registrazione. –

+0

@BrendaBell mi dispiace non ha funzionato per voi. Ha funzionato, ma ovviamente la configurazione di ognuno sarà diversa – coding4fun

14

Aprire il file di progetto (.csproj in C# o .vbproj in VB.NET) per la modifica.

Assicurarsi che il riferimento log4net sia Fully Qualified Type Name, sia HintPath e SpecificVersion=True.

<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> 
    <HintPath>..\references\log4net.dll</HintPath> 
    <SpecificVersion>True</SpecificVersion> 
</Reference> 

Salvare il file e provare a ricostruire.

+1

Grazie per la risposta. Provato purtroppo non ha funzionato: c: \ \ riferimenti log4net.dll true false coding4fun

+0

Provate il percorso opposto, se non si specifica versione: ' false ' – KMoraz

+1

No che doesn' t work – coding4fun

Problemi correlati