C#链接dll静态和动态

C# Linking dll static and dynamic

首先我将说明我的情况。我有一个 DLL 库,它对我来说是一个黑盒子。我不确定它是用什么语言写的。我猜它是 C++ 甚至是 C,但我不知道。但我确实知道 DLL 函数,所以我知道如何使用它。

好的。直奔企业。我正在编写应用程序 C# .NET,它将与上面提到的那个 DLL 一起工作。我尝试了所有我知道的 linking 方法,但只有一种有效:

我的问题是,我真的需要在某种配置文件中指定我的黑盒 dll 的路径。我可以询问任何提示我现在可以做什么,我该如何解决这个问题?更具体:是否有任何方法可以从配置文件加载字符串并使用它来填充静态 linking DllImport(const string path) 所需的常量字符串;或者还有另一种我不知道的动态 link dll 的方法?

编辑

可能重复另一个问题的答案:该问题的两个答案都提到了我无法使用的方法。正如我所说,我不能使用 LoadLibrary(异常 126),而且我不能指定硬编码的可能路径的掠夺(我说我需要从配置文件加载路径)

Sinatr 将 link 发布到 this 问题,其中 Cody Gray 给出了一个有趣的解决方案。 kernel32.dll SetDllDirectory 可以覆盖 dll 的静态 DllImport 目标路径。我需要做的就是调用这个内核函数

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);

然后在第一次使用目标dll函数之前,用保存在我的配置文件中的路径填充它。

SetDllDirectory(Settings.Default.dllPath);

重要的是为 SetDllDirectory 设置仅存在目标 dll 的文件夹路径(如 c:\folder),而不是带有 dll 名称的完整路径(如 c:\folder\name.dll)。