log4net, il Framework .Net 4.0 e il Client Profile

Questa settimana un cliente mi ha segnalato un problema relativo all’utilizzo di log4net con Visual Studio 2010 e il Framework 4.0.

In pratica creando un’app

licazione console e referenziando log4net in versione 1.2.10 in fase di build si riceve questo errore:

“The referenced assembly “log4net” could not be resolved because it has a dependency on “System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” which is not in the currently targeted framework “.NETFramework,Version=v4.0,Profile=Client”. Please remove references to assemblies not in the targeted framework or consider retargeting your project.”

Come esplicitato d

al messaggio il problema risiede nel fatto che la console application targettizza il Framework 4 Client Profile.

Framework-Client-Profile

Il Client Profile è il target predefinito per i nuovi progetti Windows Forms, Console Application, WPF e Window Service. L’idea di base del Client Profile è quella di ridurre le dimensioni del Framework .Net rimuovendo tutte le assembly che in certi progetti non servono.
Nello specifico il client profile non contiene:

  • ASP.NET
  • alcune funzionalità avanzate di Windows Communication Foundation (WCF)
  • il .NET Framework Data Provider per Oracle
  • MSBuild
log4net utilizza l’assembly System.Web tramite l’AspNetTraceAppender e quindi non è possibile compilare i progetti che targettizzano il Framework 4 Client Profile.
La soluzione più rapida è quella di modificare le proprietà del progetto selezionando come target framework “.Net Framework 4”.
La domanda a questo punto però è: “E’ corretto scegliere come target il framework in versione full?”
Se la risposta fosse solo nelle dimensioni direi che si potrebbe utilizzare direttamente la versione full.
Queste sono le dimensioni del framework 4 come riportato sul blog di Scott Hanselman:
3.5 SP1 4.0 RTM
32 bit Client Profile Online: 28 MB
Offline: 255MB
28.8 MB
32 + 64 bit Client Profile N/A 41 MB
32 bit Full N/A 35.3 MB
32 + 64 bit Full N/A 48.1 MB
32 + ia64 bit Full N/A 51.7 MB
32 + 64 + ia64 bit Full 231 MB N/A

In pratica la differenza di dimensioni si attesta sui 7 mega quindi secondo me non sostanziale.

L’accento probabilmente va posto su due punti:

  • concettualmente gli applicativi desktop è corretto che non abbiano riferimenti ad assembly relative al mondo web
  • il Framework 4 Client Profile è il framework che viene distribuito sui desktop tramite Windows Update
In base a questi punti direi che si può targettizzare il framework full in ambienti ben controllati o enterprise e preferire il Client Profile per tutti gli applicativi desktop.
Per quanto riguarda log4net nello specifico nelle versioni future potrebbe essere rilasciata una build compatibile col client profile senza riferimenti a System.Web altrimenti è necessario ricompilarlo rimuovendo l’AspNetTraceAppender.
Riferimenti:

.NET Framework Client Profile
Towards a Smaller .NET 4 – Details on the Client Profile and Downloading .NET
What’s new in .NET Framework 4 Client Profile RTM

Share