在.NET中指定DllImport的searchpath

有没有一种方法来指定searchpath与DllImport导入给定的程序集?

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

这将在应用程序目录和PATH环境variables中searchdll。 但有时这个DLL将被放置在其他地方。 可以在app.config或manifest文件中指定这些信息,以避免dynamic加载和dynamic调用?

在第一次调用导入的函数之前,用额外的DLLpath调用SetDllDirectory

P /调用签名:

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

要设置多个附加的DLLsearchpath,请修改PATH环境variables,例如:

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

有关MSDN上的DLLsearch顺序的更多信息。


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

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

如果你的Windows版本低于8,你将需要安装这个补丁 , 这个补丁在Windows AddDllDirectory和Vista中没有补丁的情况下扩展了API,但缺less了AddDllDirectory函数。

这可能是有用的DefaultDllImportSearchPathsAttribute类
例如

 [assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)] 

另外请注意,你也可以使用AddDllDirectory ,所以你不会搞砸了任何东西:

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