2013-05-27 10 views
8

Ho un progetto Wpf .net 4.0 C# che sto tentando di migrare dall'utilizzo di Log4Net all'utilizzo di NLog come libreria di log dietro la Common.Logging Façade. Mi aspettavo che fosse un compito facile, ma sai cosa dicono, Niente è mai facile.La registrazione comune non può caricare il tipo NLog.TargetWithLayout

ho usato NuGet a:

  • Scarica NLog alla versione 2.0.1.2.
  • Download Common.Logging.NLog alla versione 2.0.0.
  • Download Common.Logging.NLog20 alla versione 2.1.2.
  • È stata aggiornata la registrazione comune dalla versione 2.0.0 alla versione 2.1.2 utilizzando NuGet.

Nel file app.config ho:

<common> 
    <logging> 
     <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog"> 
      <arg key="configType" value="FILE" /> 
      <arg key="configFile" value="~/NLog.config" /> 
     </factoryAdapter> 
    </logging> 
</common> 

... e ...

<dependentAssembly> 
    <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-2.0.1.0" newVersion="2.0.1.0" /> 
    </dependentAssembly> 

Quando eseguo l'applicazione ottengo un errore che indica

'L'invocazione del costruttore su tipo' NameSpace.Shell.AppBootstrapper 'che corrisponde ai vincoli di binding specificati ha generato un'eccezione.' Numero di riga '8' e posizione di linea '18'.

L'eccezione interna è:

{ "Impossibile caricare uno o più dei tipi richiesti recuperare la proprietà LoaderExceptions per ulteriori informazioni.".}

eccezione

detto caricatore, ci è uno solo, è:

{ "Impossibile caricare il tipo 'NLog.TargetWithLayout' dal assembly 'NLog, Version = 2.0.1.0, Cult ure = neutral, PublicKeyToken = 5120e14c03d0593c'. ":" NLog.TargetWithLayout "}

chiunque ha superato questo problema o si ha un lavoro in giro per ottenere NLog working with Common.Logging?

Nell'interesse di non postare a lungo di una domanda non ho incluso il file NLog.config ma posso se sarebbe vantaggioso.

risposta

15

Dopo un po 'di guardarmi intorno dopo aver posto questa domanda, ho fatto molte ricerche prima ancora che facessi questa domanda. Ho fatto ricorso a provare cose assortite e sperando che potessero funzionare.

Quello che ho trovato era che il Common.Logging.NLog.NLogLoggerFactoryAdapter che stavo usando era utilizzando proveniva dal Common.Logging.Nlog dll e che dll ha un refrence a NLog 1.0.0.505 che utilizza la vecchia posizione per la classe NLog.TargetWithLayout.

Ho rimosso il pacchetto Common.Logging.Nlog con NuGet e ho cambiato il riferimento nell'app.file di configurazione per:

<factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog20"> 

Ciò allora utilizza la classe corretta che si trova nel pacchetto NLog 2.0.1.2 e permette NLog, e l'applicazione di boot-up.

Spero che questo aiuti chiunque altro che si imbatte in questo problema. Non sono riuscito a trovare nessun altro che documentasse come gestirlo.

2

Probabilmente è stato installato il pacchetto CommonLogging.NLog NuGet anziché Common.Logging.Nlog20. Controlla il riferimento a nuget che può essere confuso a causa della versione 2 di CL e della versione 2 di NLog. Ciò che apparentemente è la versione 2 di CL ma NLogLoggerFactoryAdapter per NLog versione 1.

+0

Sembra corretto. È praticamente quello che ho detto nella risposta sopra. – Klee

+0

Ho capito cosa sta succedendo. vedere qui https://github.com/net-commons/common-logging/issues/23#issuecomment-23339522 – skalinkin