2011-03-08 57 views
4

我有一個數據訪問層被編譯成一個dll。在這個層中,我使用Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll來記錄異常,然後將它們返回給調用者。爲什麼我必須在客戶端代碼中引用ExceptionHandling.Logging dll?

我有一個客戶端應用程序引用數據訪問層DLL,但不直接調用到Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll。在數據訪問層出現異常時,我的客戶端代碼中會出現以下運行時異常,除非我從客戶端應用程序添加對Enterprise Library DLL的引用。

無法解析「Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler,Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging,版本= 5.0.414.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35」類型。請驗證拼寫是否正確或提供了完整的類型名稱。

我不明白爲什麼客戶端需要引用企業庫DLL,即使它沒有在代碼中引用它。

任何想法將不勝感激。

回答

0

沒有必要從您的客戶端應用程序中引用Enterprise Library DLL。
問題是該文件既不在GAC中,也不在您的bin文件夾中。當您從啓動項目(客戶端應用程序)添加引用時,它會被複制,因爲「複製本地」屬性設置爲True(默認)。

只有您的啓動項目直接引用的dll被複制到\ bin文件夾。

作爲引用引用的Dll不會被複制。

另一種解決方法是,如果你不想直接引用dll文件,那就是創建一個後期構建腳本。

7

這都是CLR在運行時定位和綁定到您的程序集的問題。

由於您的客戶端直接調用您的DAL.dll,它需要在編譯時引用DAL.dll。類似的,因爲你的DAL.dll直接調用EL.Logging.dll它需要在編譯時引用EL.Logging.dll。

但是,由於客戶端不是直接依賴於EL.Logging.dll,因此不需要引用進行編譯。也就是說,在運行時,CLR將不得不定位並綁定到所有3個程序集:客戶端,DAL.dll和EL.Logging.dll。

您不需要添加引用來編譯,但是通過這樣做,將「複製本地」標誌設置爲true,即可將EL.Logging.dll部署到客戶機文件夾。現在在運行時,所有的DLL都可以定位。

來達到同樣效果的其他途徑有:

  • 註冊企業庫在GAC
  • 創建後生成作用
  • 手動執行的DLL的Xcopy部署需要
  • 指定<codebase>在配置中定位組件
  • 在配置中使用<probing>來探測子目錄(可能對您無用)
相關問題