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

wtzytmuj  于 2023-01-10  发布在  .NET
关注(0)|答案(4)|浏览(169)

是否有一种方法可以为使用DllImport导入的给定程序集指定要搜索的路径?

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

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

w8biq8rn

w8biq8rn1#

在第一次调用导入的函数之前,使用附加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);
}

有更多关于DLL搜索顺序here on MSDN的信息。

更新日期2013年7月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);
}
pgx2nnw8

pgx2nnw82#

在第一次调用导入的函数之前,尝试使用其他DLL路径调用AddDllDirectory
如果你的Windows版本低于8,你需要安装this patch,它扩展了Windows 7、2008 R2、2008和Vista的API,缺少AddDllDirectory函数(不过没有XP的补丁)。

v64noz0r

v64noz0r3#

这可能会有用DefaultDllImportSearchPathsAttribute Class
例如

[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]

还要注意的是,你也可以使用AddDllDirectory,这样你就不会搞砸已经存在的东西:

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

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);

相关问题