【问题标题】:Loading dlls from path specified in SetdllDirectory in c#从 c# 中的 SetdllDirectory 中指定的路径加载 dll
【发布时间】:2012-07-09 18:56:42
【问题描述】:

我是 dotnet 的新手。我有一个 dotnet dll,它使用 DllImport 加载 c dll。我想将所有 dll 放在一个与应用程序位置不同的文件夹中。我不想修改环境变量。所以我使用setdlldirectory API 并通过Assembly.Loadfrom(..) 加载我的c# 程序集。我通过验证GetDllDirectory(..) 的值来检查SetdllDirectory 工作正常。但它既不是从该文件夹加载 C# dll 也不是 c dll。我可以通过在Assembly.Loadfrom 中指定路径来加载C# dll。但无法加载c dll。

提前致谢!!

【问题讨论】:

    标签: c# c windows winapi


    【解决方案1】:

    我建议在运行时将目录路径添加到 PATH 环境变量,使用以下代码:

    var dllDirectory = @"C:/some/path";
    Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory);
    

    这样,更改只影响正在运行的进程,退出时被丢弃。

    【讨论】:

    • 其实我不想修改任何环境变量。有什么办法可以从SetDllDirectory中指定的路径加载C#dll和c#dll??
    • 这是最简单的方法,您根本不必使用 SetDllDirectory。当您通过 .NET 互操作 (DllImport) 加载 dll 时,将不会使用通过 SetDllDirectory 函数设置的路径,您必须使用 LoadLibrary (kernel32.dll) 获取函数指针,然后使用编组从该 dll 获取函数的委托.这可能会有所帮助:stackoverflow.com/a/1750938/1515409
    • Tomek,我很确定 SetDllDirectory 会影响 PInvoke DLL 的加载位置。
    【解决方案2】:

    查看LoadFrom 的文档,您会发现它说:如果存在用于assemblyFile 的本机映像,则不使用它。程序集无法作为域中性加载。

    我相信您需要将 DLL 目录添加到 EXE 的路径中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-07
      • 2014-09-19
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      相关资源
      最近更新 更多