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

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

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

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


在第一次调用导入的函数之前,请使用附加的DLL路径调用SetDllDirectory

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搜索顺序的更多信息。


更新 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);
}

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

如果你的Windows版本低于8,你需要安装这个补丁程序,这个补丁程序通过缺少Windows AddDllDirectory和Vista的AddDllDirectory函数来扩展API(虽然没有补丁程序)。


这可能是有用的DefaultDllImportSearchPathsAttribute类
例如

[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]

另外请注意,您也可以使用AddDllDirectory,因此您不会搞砸任何东西:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AddDllDirectory(string path);
链接地址: http://www.djcxy.com/p/44579.html

上一篇: Specify the search path for DllImport in .NET

下一篇: How to use foreign keys and a spatial index inside a MySQL table?