在.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);
- 如何在FtpWebRequest之前检查FTP上是否存在文件
- 在C#中embeddedIronPython的问题(缺less编译器所需的成员“Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember”
- 在.config文件中启用自定义节的智能感知
- 字节码在本地代码上的优点是什么?
- .NET 4.0是否与Windows XP SP2或更低版本兼容?
- Guid全是0(零)?
- Directory.EnumerateFiles与Directory.GetFiles有什么区别?
- 使用(LINQ / Predicate)将DataTable的所有列名称获取到string数组中
- 如何获得.Net中给定types的程序集(System.Reflection.Assembly)?