【问题标题】:DLL Hell - Need to have C# assembly (DLL) link to C DLLs from a specific locationDLL Hell - 需要 C# 程序集 (DLL) 从特定位置链接到 C DLL
【发布时间】:2010-12-15 22:36:42
【问题描述】:

我的这个问题让我把头发拔掉了。这与我之前遇到的需要写Mutex that will get destroyed when going out of scope 的问题有关。事实证明我很愚蠢并且不需要互斥锁——我需要锁定的东西不会观察到锁,因为它们实际上是从同一个线程调用的。我没有意识到一组呼叫来自定时器。哎呀。

无论如何,我正在做一些调查,试图帮助缩小我们与该第 3 方 DLL 相关的问题的原因。他们似乎相信,如果我们在不同的文件夹中拥有他们的 C DLL 的多个副本(我们现在将它们称为 a.dll 和 b.dll),并且只在使用它们的 C# 程序集本地,那么生活将会很好,并且我终于可以回家真正见到我的家人了。

建议的文件夹结构如下所示:

+--App folder
   +--DeviceA.dll
   +--a.dll (linked to by DeviceA)
   +--b.dll (linked to by a.dll)
   +--Device B Folder
      +--DeviceB.dll
      +--a.dll
      +--b.dll

我的问题是,即使 DeviceB.dll 位于单独的文件夹中,但在加载时,它不会加载并在 Device B 文件夹中查找其依赖项——而是在 App 文件夹中查找。我真的需要能够保证它链接到的 DLL 与 App 文件夹中的完全不同。

我查看了构建属性,阅读了清单上的一些内容,但还没有弄清楚。这甚至可能吗?如果我知道 DeviceB.dll 在不同的文件夹中,我是否必须设置 CurrentDirectory 或类似的东西来强制它链接到自己文件夹中的 DLL,而不是从正在执行的程序集的文件夹中?

编辑——实际上,“设备B文件夹”中的a.dll应该是c.dll。所以a.dll链接到b.dll,c.dll链接到b.dll。我无法更改此行为,因为第 3 方 DLL 已编译为链接到 b.dll。

【问题讨论】:

    标签: c# .net dll


    【解决方案1】:

    一旦您加载了一个 DLL(在 SDK 级别,使用 LoadLibrary),它就在您的进程空间中。如果您尝试再次加载它,您只会增加引用计数。换句话说,您将无法加载同一个 DLL 的两个不同版本,因为它们具有相同的模块名称。

    【讨论】:

    • 我认为这行不通。太糟糕了...有没有办法修改二进制文件以至少破解系统,直到第 3 方开发人员可以修复它(假设他甚至会?)?
    • 实际上,也许我应该澄清一下——我在 DLL 加载以及它在后台如何工作方面有点弱。我不记得除了文件名之外有任何“模块名称”的 DLL。在我上面的例子中,我有 a.dll 和 b.dll 的两个不同的副本,但是我没有提到实际上我已经将设备 B 的依赖项重命名为 c.dll,但是 b.dll 仍然是 b.dll。我无法更改它,因为我无法更改第 3 方 DLL 的链接。所以......是的,我想我很不走运,因为你说即使 b.dll 在另一个文件夹中,它仍然会被引用。
    • 是的,可能,虽然这是一个很大的痛苦。在 DLL 的 .DEF 文件中,顶部有一个“LIBRARY libname”命令。正是这个 libname 用作唯一的模块名称,因此如果您修补第二组 DLL 以使用不同的 libname,那就可以了。您还需要使用 ImpLib 生成新的 .LIB 文件并编译为这些文件。但是,不能保证任何一个 DLL 都会与其自身和平共存。
    • @Steven - 是的,我相信这对我来说有点无用。没用,因为我认为缺陷是 3rd 方 DLL 中的一些静态数据,但有用的是我正在学习一些我以前从未涉足过的东西,即 DLL 加载的具体细节。
    • 我认为你能做的最好的事情就是证明这是他们的错,这样你就可以让他们修复他们自己的产品。
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2013-06-08
    • 2012-02-29
    相关资源
    最近更新 更多