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

时间:2011-03-08 18:40:04

标签: c#-4.0 enterprise-library

我有一个编译成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,Version = 5.0.414.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'。请确认拼写正确或提供完整的类型名称。

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

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分: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>以查找程序集
  • 在配置中使用<probing>来探测子目录(可能对您没用)

答案 1 :(得分:0)

没有必要从客户端应用程序引用Enterprise Library dll 问题是该文件既不在GAC中,也不在bin文件夹中。当您从启动项目(客户端应用程序)添加对它的引用时,它会被复制,因为Copy Local属性设置为True(默认值)。

只有启动项目直接引用的dll才会被复制到\ bin文件夹。

引用引用的Dll不会被复制。

另一种方法是,如果你不想直接引用dll文件,那就是创建一个后期构建脚本。