哪个程序集执行代码?

时间:2018-03-14 13:38:08

标签: c# .net dll

我正在使用.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。如果没有几年的重写,这是不可改变的......)

1 个答案:

答案 0 :(得分:0)

您可以使用程序集绑定重定向并希望Universe不会中断(不能保证较新的DLL向后兼容),或者您可以强名称 dll。

为什么呢? .NET通常不允许您在同一AppDomain中多次加载“相同”程序集,除非它是强名称。什么是强有力的命名?它是一种身份和数字签名形式,包括:

  1. 汇编文件名
  2. 装配版本
  3. 装配文化
  4. 装配公钥
  5. 当它的名字命名时,两个dll在同一个进程中并行运行AppDomain,具有完美的向后兼容性。

    或者,如果您不想使用强命名(因为许多文件可能需要签名)或绑定重定向,您可以随时创建其他AppDomain并将dll版本加载到每个域中。

    虽然它解决了摆弄文件的问题,但它确实需要对应用程序的其余部分进行大量修改,这使得它在开发的这一点上成为一个可以说是糟糕的选择。

    编辑:我现在看到您在两者上使用强名称

      

    如何强制使用正确的DLL

    要区分完全相同的命名空间中的两种类型,您可能必须在dll引用中为较新的程序集创建别名Tell me more...