2011-06-08 47 views
7

我正在編寫一個面向.NET Framework 4 Client Profile的控制檯應用程序中的代碼。爲什麼log4net 1.2.10需要System.Web?

this.container.AddFacility<LoggingFacility>(
    f => f.LogUsing(LoggerImplementation.Log4net)); 

運行時,它會因類型轉換錯誤而失敗。

無法轉換從 'Castle.Services.Logging.Log4netIntegration.Log4netFactory,Castle.Services.Logging.Log4netIntegration,版本= 2.5.1.0, 文化=中性公鑰= 407dd0808d44fbdc' 到System.Type的 - 也許類型不能 找到

這是因爲Castle.Services.Logging.log4netIntegration組件不會被複制到輸出文件夾。作爲僅運行時依賴項,這不會破壞構建。

看着構建過程,我發現它沒有複製log4net或Castle設施程序集,因爲它們依賴於客戶端配置文件中沒有的System.Web。更改爲標準配置文件意味着此相關性可用,並且可以添加設施。

爲什麼要這樣做?我在控制檯應用程序中的客戶端配置文件的目標是否作爲服務器上的計劃任務使用有什麼不同?

回答

7

一些appender依賴於System.Web,例如AspNetTraceAppender。開發人員唯一可用的其他選擇是將不依賴於系統內核的組件拆分爲單獨的組件,但這會破壞log4net的美感,因爲它非常易於使用。另外在編寫log4net的時候,我不認爲他們是一個客戶端配置文件。

由於log4net是開源的,因此不會阻止您下載源代碼並刪除違規類並創建您自己的以Client Profile爲中心的log4net程序集。

http://www.thecodeking.co.uk/2010/08/making-log4net-work-with-net-client.html

  1. 下載log4net的源
  2. 打開&使用Visual Studio 2010
  3. 升級的解決方案中刪除的System.Web項目引用
  4. 從項目中排除追加程序\ AspNetTraceAppender.cs類
  5. 添加對System.Configuration的引用
  6. 導航到Project - > log4net屬性,然後選擇應用程序選項卡
  7. 將目標框架更改爲.NET Framework 3。5客戶端配置文件
  8. 選擇生成選項卡,並將配置更改爲調試
  9. 在條件編​​譯符號下,將其更改爲NET; NET_1_0; NET_2_0;
  10. 將配置更改爲版本
  11. 在條件編​​譯符號下,將其更改爲STRONG; NET; NET_1_0; NET_2_0;
  12. 編輯的AssemblyInfo.cs類和更新AssemblyKeyFile中使用有效的強密鑰
  13. 屬性編譯發佈模式項目和分發新組件
+0

感謝Bronumski。 – 2011-06-09 14:29:41

+1

剛剛下載了最新的二進制文件(1.2.11),它包含與\ bin \ net-cp \ 4.0 \ release中的4.0 Client Profile兼容的版本。只是測試它,並像魅力一樣工作! – SvenG 2012-04-20 09:07:29

-4

下面是我的想法:Log4Net使用System.Web,因爲開發人員認爲這是最好的選擇。

如果您不想要這個權重,請考慮一個不需要System.Web的日誌項目。還有其他選項。

+0

位模糊的迴應。其他日誌記錄選項是什麼?我自己只使用log4net或核心診斷組件。 – Bronumski 2011-06-08 16:35:45

+0

我喜歡Stack Overflow'AttemptKillOfReputation()',因爲所有的作業都沒有爲我完成。 – 2011-06-08 17:33:22

+8

我覺得你的回答比有幫助的更不屑一顧。 – 2011-06-08 18:01:49