有没有办法为使用DllImport导入的给定程序集指定要搜索的路径?
[DllImport("MyDll.dll")]
static extern void Func();
这将在app dir和PATH环境变量中搜索dll。但有时dll会放在其他地方。可以在app.config或manifest文件中指定此信息以避免动态加载和动态调用吗?
答案 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);