DLL Hell - 需要从特定位置获得C#assembly(DLL)链接到C DLL

时间:2010-02-04 20:51:57

标签: c# .net dll

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

无论如何,我正在做一些调查,试图帮助缩小我们第三方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。我无法更改此行为,因为第三方DLL已编译为链接到b.dll。

1 个答案:

答案 0 :(得分:3)

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