是否有一种方法可以为使用DllImport导入的给定程序集指定要搜索的路径?
[DllImport("MyDll.dll")] static extern void Func();
这将在app目录和PATH环境变量中搜索dll。但有时dll会被放在其他地方。是否可以在app.config或manifest文件中指定此信息以避免动态加载和动态调用?
w8biq8rn1#
在第一次调用导入的函数之前,使用附加DLL路径调用SetDllDirectory。P/调用签名:
SetDllDirectory
[DllImport("kernel32.dll", SetLastError = true)] static extern bool SetDllDirectory(string lpPathName);
要设置多个附加DLL搜索路径,请修改PATH环境变量,例如:
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年7月30日:
使用Path.PathSeparator更新上述内容的版本:
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); }
pgx2nnw82#
在第一次调用导入的函数之前,尝试使用其他DLL路径调用AddDllDirectory。如果你的Windows版本低于8,你需要安装this patch,它扩展了Windows 7、2008 R2、2008和Vista的API,缺少AddDllDirectory函数(不过没有XP的补丁)。
AddDllDirectory
v64noz0r3#
这可能会有用DefaultDllImportSearchPathsAttribute Class例如
[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
还要注意的是,你也可以使用AddDllDirectory,这样你就不会搞砸已经存在的东西:
[DllImport("kernel32.dll", SetLastError = true)] static extern bool AddDllDirectory(string path);
6yt4nkrj4#
我认为这个问题,即使是更古老的仍然是相当revenant无论框架的发展,现在,也许“最好的”方式来做到这一点是通过使用框架本身.任何人有兴趣,我建议使用DefaultDllImportSearchPaths属性对任何本地/外部库.这里是一个例子:
[DefaultDllImportSearchPaths(DllImportSearchPath.SafeDirectories)] [DllImport("Netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] static extern int NetServerGetInfo(string serverName, int level, out IntPtr pSERVER_INFO_XXX);
4条答案
按热度按时间w8biq8rn1#
在第一次调用导入的函数之前,使用附加DLL路径调用
SetDllDirectory
。P/调用签名:
要设置多个附加DLL搜索路径,请修改
PATH
环境变量,例如:有更多关于DLL搜索顺序here on MSDN的信息。
更新日期2013年7月30日:
使用
Path.PathSeparator
更新上述内容的版本:pgx2nnw82#
在第一次调用导入的函数之前,尝试使用其他DLL路径调用
AddDllDirectory
。如果你的Windows版本低于8,你需要安装this patch,它扩展了Windows 7、2008 R2、2008和Vista的API,缺少
AddDllDirectory
函数(不过没有XP的补丁)。v64noz0r3#
这可能会有用DefaultDllImportSearchPathsAttribute Class
例如
还要注意的是,你也可以使用AddDllDirectory,这样你就不会搞砸已经存在的东西:
6yt4nkrj4#
我认为这个问题,即使是更古老的仍然是相当revenant无论框架的发展,现在,也许“最好的”方式来做到这一点是通过使用框架本身.任何人有兴趣,我建议使用DefaultDllImportSearchPaths属性对任何本地/外部库.这里是一个例子: