Specify the search path for DllImport in .NET

梦想与她 提交于 2019-11-26 12:16:22
Chris Schmich

Call SetDllDirectory with your additional DLL paths before you call into the imported function for the first time.

P/Invoke signature:

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

To set more than one additional DLL search path, modify the PATH environment variable, e.g.:

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

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

There's more info about the DLL search order here on MSDN.


Updated 2013/07/30:

Updated version of the above using 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);
}
jvrdev

Try calling AddDllDirectory with your additional DLL paths before you call into the imported function for the first time.

If your Windows version is lower than 8 you will need to install this patch, which extends the API with the missing AddDllDirectory function for Windows 7, 2008 R2, 2008 and Vista (there is no patch for XP, though).

This might be useful DefaultDllImportSearchPathsAttribute Class
E.g.

[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]

Also note you can use AddDllDirectory as well so you aren't screwing up anything already there:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AddDllDirectory(string path);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!