為什麼 log4net 1.2.10 需要 System.Web?
我正在針對 .NET Framework 4 客戶端配置文件的控制台應用程序中編寫此程式碼。
this.container.AddFacility<LoggingFacility>( f => f.LogUsing(LoggerImplementation.Log4net));當它執行時,它會因類型轉換錯誤而失敗。
無法從 ‘Castle.Services.Logging.Log4netIntegration.Log4netFactory,Castle.Services.Logging.Log4netIntegration,Version=2.5.1.0, Culture=neutral,PublicKeyToken=407dd0808d44fbdc’ 轉換為 System.Type - 可能找不到類型
這是因為 Castle.Services.Logging.log4netIntegration 程序集未復製到輸出文件夾。作為僅執行時的依賴項,這不會破壞建構。
查看建構過程,我發現它沒有複製 log4net 或 Castle 設施程序集,因為它們依賴於 Client Profile 中不可用的 System.Web。更改為標準配置文件意味著此依賴項可用並且可以添加該工具。
為什麼要這樣做?我沒有在設計用作伺服器上的計劃任務的控制台應用程序中定位客戶端配置文件有什麼區別?
一些附加程序依賴於 System.Web,例如 AspNetTraceAppender。開發人員唯一可用的其他選擇是將不依賴於系統核心的組件拆分為單獨的程序集,但這會破壞 log4net 的美感,因為它使用起來非常簡單。此外,在編寫 log4net 時,我不相信有客戶端配置文件之類的東西。
由於 log4net 是開源的,因此沒有什麼可以阻止您下載原始碼並刪除有問題的類並創建自己的以客戶端配置文件為中心的 log4net 程序集。
http://www.thecodeking.co.uk/2010/08/making-log4net-work-with-net-client.html
- 下載log4net源
- 使用 Visual Studio 2010 打開和升級解決方案
- 刪除 System.Web 項目引用
- 從項目中排除 Appender\AspNetTraceAppender.cs 類
- 添加對 System.Configuration 的引用
- 導航到項目 -> log4net 屬性,然後選擇應用程序選項卡
- 將目標框架更改為 .NET Framework 3.5 Client Profile
- 選擇 Build 選項卡,並將配置更改為 Debug
- 在條件編譯符號下將其更改為 NET;NET_1_0;NET_2_0;
- 將配置更改為發布
- 在條件編譯符號下將其更改為 STRONG;NET;NET_1_0;NET_2_0;
- 編輯 AssemblyInfo.cs 類並使用有效的強密鑰更新 AssemblyKeyFile 屬性
- 在 Release 模式下編譯項目並分發新的程序集