C#链接dll静态和动态

时间:2016-04-12 08:57:11

标签: c# .net dll static-linking dynamic-linking

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

确定。直接到企业。我正在编写应用程序C#.NET,它将与上面提到的DLL一起使用。我尝试了所有人都知道链接方法,但只有一个工作:

  • 静态:[DllImport("myDll.dll")] - 有效。
  • 动态:由Kernel32.dll LoadLibrary / FreeLibrary - 我得到代码126的异常 - The specified module could not be found。这个问题在于缺少依赖性。
  • 动态:通过反射 - 当使用Assembly.LoadFile(aPathFileName)时,我遇到异常:The module was expected to contain an assembly manifest

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

修改

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

1 个答案:

答案 0 :(得分:1)

Sinatr发布了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 ONLY路径设置为目标dll所在的文件夹(如c:\ folder),而不是dll名称的完整路径(如c:\ folder \ name.dll)。