为什么我必须在客户端代码中引用ExceptionHandling.Logging dll?

use*_*593 4 enterprise-library c#-4.0

我有一个编译成dll的数据访问层.在这个层中,我使用Microsoft.Practices.EnterpriseLibrary.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,文化=中性公钥= 31bf3856ad364e35' 无法解析.请验证拼写是否正确或是否提供了完整的类型名称.

我不明白为什么客户端必须引用Enterprise Library dll,即使它没有在代码中引用它.

任何想法将不胜感激.

Ran*_*ica 7

这都是CLR在运行时定位和绑定到程序集的问题.

由于您的客户端直接调用您的DAL.dll,因此在编译时需要引用DAL.dll.类似地,因为你的DAL.dll直接调用EL.Logging.dll,它需要在编译时引用EL.Logging.dll.

但是,由于Client不直接依赖于EL.Logging.dll,因此不需要编译引用.也就是说,在运行时,CLR将必须找到并绑定到所有3个程序集:Client,DAL.dll和EL.Logging.dll.

您不需要添加对编译的引用,但是通过将Copy Local标志设置为true,您将EL.Logging.dll部署到Client文件夹.现在,在运行时,所有DLL都是可定位的.

实现相同效果的其他方法是:

  • 在GAC中注册企业库
  • 创建一个后期构建操作
  • 手动执行所需DLL的XCopy部署
  • 指定<codebase>in配置以查找程序集
  • 使用<probing>在配置探测子目录(很可能不是对您有用)