我正在使用.net项目,该项目正在使用第三方.net DLL。其中一些DLL使用常见的DLL(例如Microsoft.Practices.EnterpriseLibrary.Logging)。现在我们想在更新的版本中使用相同的常见DLL。我们不被允许使用GAC(政治)。
我们已将不同目录中的部分分开。
Third party \ Third party.dll
old common (Microsoft.Practices.EnterpriseLibrary.Logging.dll)
Our libs \ our lib.dll
new common (Microsoft.Practices.EnterpriseLibrary.Logging.dll)
惊喜,惊喜,它没有用。在我们的DLL中,抛出错误说,某些选项无效。是的,我没有在旧的普通中找到它,而是在新的。所以,我猜,错误的可执行文件被采用了。
在Visual Studio(2015)中,我们启用了" Spezific版本"在引用中,在Debug / module窗口中,加载了两个DLL。
编辑:所有Dll都有强名称。
如何确定执行了哪个DLL(步进F11只是跳转到catch块)?如何强制使用正确的DLL?
(架构首先加载第三方DLL,然后加载我们自己的dll。如果没有几年的重写,这是不可改变的......)
答案 0 :(得分:0)
您可以使用程序集绑定重定向并希望Universe不会中断(不能保证较新的DLL向后兼容),或者您可以强名称 dll。
为什么呢? .NET通常不允许您在同一AppDomain
中多次加载“相同”程序集,除非它是强名称。什么是强有力的命名?它是一种身份和数字签名形式,包括:
当它的名字命名时,两个dll在同一个进程中并行运行AppDomain
,具有完美的向后兼容性。
或者,如果您不想使用强命名(因为许多文件可能需要签名)或绑定重定向,您可以随时创建其他AppDomain
并将dll版本加载到每个域中。
虽然它解决了摆弄文件的问题,但它确实需要对应用程序的其余部分进行大量修改,这使得它在开发的这一点上成为一个可以说是糟糕的选择。
编辑:我现在看到您在两者上使用强名称。
如何强制使用正确的DLL
要区分完全相同的命名空间中的两种类型,您可能必须在dll引用中为较新的程序集创建别名。 Tell me more...