如何指定.NET中DllImport的搜索路径?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

有没有一种方法可以指定要用DllImport导入的给定组件的搜索路径?

[DllImport("MyDll.dll")]
static extern void Func();

这将在应用程序目录和PATH环境变量中搜索dll。但有时DLL会放在其他地方。这些信息是否可以在app.config或manifest文件中指定,以避免动态加载和动态调用?

提问于
用户回答回答于

打电话SetDllDirectory与你额外的DLL路径,你调用到首次导入功能之前。

P /调用签名:

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

要设置多个附加DLL搜索路径,请修改PATH环境变量,例如:

static void AddEnvironmentPaths(string[] paths)
{
    string path = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
    path += ";" + string.Join(";", paths);

    Environment.SetEnvironmentVariable("PATH", path);
}

有关MSDN上 DLL搜索顺序的更多信息。

以上使用的更新版本Path.PathSeparator

static void AddEnvironmentPaths(IEnumerable<string> paths)
{
    var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? string.Empty };

    string newPath = string.Join(Path.PathSeparator.ToString(), path.Concat(paths));

    Environment.SetEnvironmentVariable("PATH", newPath);
}
用户回答回答于

AddDllDirectory在第一次调用导入的函数之前,请尝试使用额外的DLL路径调用。

如果你的Windows版本低于8,你需要安装这个补丁程序这个补丁程序扩展了缺少AddDllDirectoryWindows 7,2008 R2,2008和Vista功能的API (虽然没有补丁程序)。

扫码关注云+社区