2011-03-08 61 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>来探测子目录(可能对您无用)
相关问题