gpt4 book ai didi

c# - 哪个程序集执行代码?

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:44 26 4
gpt4 key购买 nike

我正在开发一个 .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 中抛出一个错误,说某些选项无效。是的,我没有在旧的公共(public)场所找到它,而是在新的公共(public)场所。所以,我猜,采用了错误的可执行文件。

在 Visual Studio (2015) 中,我们在引用中启用了“特定版本”,并且在调试/模块窗口中,加载了两个 DLL。

编辑:所有 Dll 都有强名称。

如何确定执行了哪个 DLL(按 F11 单步跳转到 catch block )?如何强制使用正确的 DLL?

(架构先加载第三方DLL,再加载我们自己的dll。这不是几年改写就能改变的...)

最佳答案

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

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

  1. 程序集文件名
  2. 汇编版本
  3. 集会文化
  4. 程序集公钥

当它是强名称时,两个 dll 在同一进程内的同一 AppDomain 中并排运行,具有完美的向后兼容性。

或者,如果您不想使用强命名(因为许多文件可能需要签名)或绑定(bind)重定向,您始终可以创建额外的 AppDomain 并将一个版本的 dll 加载到每个领域。

虽然它解决了摆弄文件的问题,但它确实需要对应用程序的其余部分进行大量返工,因此在您的开发阶段,它可能是一个糟糕的选择。

编辑:我现在看到您在两者上都使用了strong names

How do I force using the correct DLL

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

关于c# - 哪个程序集执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com