C#链接dll静态和动态

C#链接dll静态和动态,c#,.net,dll,static-linking,dynamic-linking,C#,.net,Dll,Static Linking,Dynamic Linking,首先我会解释我的情况。我有一个DLL库,它对我来说是一个黑匣子。我不知道它是用什么语言写的。我猜是C++,甚至C,但我不知道。但我知道DLL函数,所以我知道如何使用它 嗯。直接去做生意。我正在编写应用程序C#.NET,它将与上面提到的DLL一起工作。我尝试了所有“我知道”的链接方法,但只有一种有效: 静态:[DllImport(“myDll.dll”)]-这很有效 动态:通过Kernel32.dll LoadLibrary/FreeLibrary-我遇到代码126异常-找不到指定的模块。这个问

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

嗯。直接去做生意。我正在编写应用程序C#.NET,它将与上面提到的DLL一起工作。我尝试了所有“我知道”的链接方法,但只有一种有效:

  • 静态:
    [DllImport(“myDll.dll”)]
    -这很有效
  • 动态:通过Kernel32.dll LoadLibrary/FreeLibrary-我遇到代码126异常-
    找不到指定的模块
    。这个问题在于缺少依赖性
  • 动态:通过反射-当使用Assembly.LoadFile(aPathFileName)时,我遇到了一个异常:
    模块应该包含一个程序集清单
我的问题是,我真的需要在某种配置文件中指定黑盒dll的路径。我能问一下我现在能做什么,如何解决这个问题吗?更具体地说:是否有任何方法可以从配置文件加载字符串,并使用它填充静态链接DllImport(conststringpath)所需的常量字符串;或者有另一种方法来动态链接dll,我不知道

编辑

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

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

[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)。

这篇文章可能有用!在调用我的黑盒dll方法之前,我可以调用kernel32.dll SetDllDirectory并用配置文件中的路径填充它,该方法由静态dlliport链接!我会试试,然后贴出正确的答案。