gpt4 book ai didi

c# - 提供外部程序集 native dll 依赖项的路径

转载 作者:太空狗 更新时间:2023-10-29 23:53:34 27 4
gpt4 key购买 nike

我有一个加载托管程序集集的 C# 应用程序。如果可用,其中一个程序集会加载两个 native dll(每个都位于不同的位置)。我正在尝试找到为那些 native dll 提供搜索路径的方法。

还有其他选择吗?我真的不想在我的软件中提供那些 dll - 将它们复制到程序目录当然可以解决问题。

我试过使用 SetDllDirectory 系统函数,但使用它可能只提供一个路径。每次调用此函数都会重置路径。

设置PATH环境变量也不能解决问题:/

最佳答案

我知道这是一篇旧文章,但只有这样才有答案:使用 LoadLibary 函数您可以强制加载 native DLL:

public static class Loader
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string fileName);
}

您必须在任何其他 DLL 调用之前调用它 - 我通常在主程序的静态构造函数中调用它。我必须为 DllImport() 执行此操作,并且静态构造函数始终在加载 native DLL 之前执行 - 它们仅在第一次调用导入函数时才实际加载。

例子:

class Program
{
static Program()
{
Loader.LoadLibrary("path\to\native1.dll");
Loader.LoadLibrary("otherpath\to\native2.dll");
}
}

加载库后,它应该满足您正在加载的其他托管程序集的 DllImports()。如果没有,它们可能会使用其他方法加载,您可能别无选择,只能在本地复制它们。

注意:这只是一个 Windows 解决方案。为了使它更具跨平台性,您必须自己检测操作系统并使用正确的导入;例如:

    [DllImport("libdl")] 
public static extern IntPtr DLOpen(string fileName, int flags);

[DllImport("libdl.so.2")]
public static extern IntPtr DLOpen2(string fileName, int flags);
// (could be "libdl.so.2" also: https://github.com/mellinoe/nativelibraryloader/issues/2#issuecomment-414476716)

// ... etc ...

关于c# - 提供外部程序集 native dll 依赖项的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6185915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com