我有一个编译成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,即使它没有在代码中引用它。
任何想法都会受到赞赏。
答案 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都是可定位的。
达到同样效果的其他方法是:
<codebase>
以查找程序集<probing>
来探测子目录(可能对您没用)答案 1 :(得分:0)
没有必要从客户端应用程序引用Enterprise Library dll 问题是该文件既不在GAC中,也不在bin文件夹中。当您从启动项目(客户端应用程序)添加对它的引用时,它会被复制,因为Copy Local属性设置为True(默认值)。
只有启动项目直接引用的dll才会被复制到\ bin文件夹。
引用引用的Dll不会被复制。
另一种方法是,如果你不想直接引用dll文件,那就是创建一个后期构建脚本。