在.NET中指定DllImport的搜索路径

时间:2010-05-19 10:34:42

标签: .net dllimport

有没有办法为使用DllImport导入的给定程序集指定要搜索的路径?

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

这将在app dir和PATH环境变量中搜索dll。但有时dll会放在其他地方。可以在app.config或manifest文件中指定此信息以避免动态加载和动态调用吗?

3 个答案:

答案 0 :(得分:65)

在您第一次调用导入的函数之前,使用其他DLL路径调用SetDllDirectory

P / Invoke签名:

[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);
}

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


已更新 2013/07/30:

使用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);
}

答案 1 :(得分:14)

在您第一次调用导入的函数之前,尝试使用其他DLL路径调用AddDllDirectory

如果您的Windows版本低于8,则需要安装this patch,这会扩展API,但缺少{7}}功能,适用于Windows 7,2008 R2,2008和Vista(没有补丁对于XP,但是)。

答案 2 :(得分:1)

这可能有用DefaultDllImportSearchPathsAttribute Class
E.g。

[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]

另请注意,您也可以使用AddDllDirectory,这样您就不会搞砸现有的任何内容:

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