【问题标题】:Unable to load DLL when process not started in the current directory (.NET Core 2.1.4)当前目录中未启动进程时无法加载 DLL (.NET Core 2.1.4)
【发布时间】:2018-03-28 17:05:45
【问题描述】:

这是一个加载 C++ dll (DllImport) 的 .NET Core 2.0 控制台应用程序。它在所有情况下都“适用于我的机器”(Windows 10、.NET Core 2.1.103)。 但是当部署在登台环境中时。如果 exe 不是从其当前目录执行,它就不起作用:如果我从父目录运行可执行文件,我会得到一个 System.DllNotFoundException: Unable to load DLL '***' : The specified module could not be found. (Exception from HRESULT: 0x8007007E)

问题是这个过程是这样启动的,我别无选择! (即从位于父文件夹中的父进程开始)

我已尝试在 Main 方法中添加 SetCurrentDirectory + SetDllDirectory,但没有任何效果。

总结一下:

  • 如果应用程序是从 CLI 使用 dotnet ***.dll 启动的,它可以从任何目录运行
  • 如果应用程序使用 Process.Start() 从另一个进程以相同方式启动,则会失败
  • 如果应用作为可执行文件发布,则可以使用当前目录中的 CLI 运行
  • 但它从父目录失败,当然,也使用Process.Start()(这是最终用例)

最后一个细节:DllImport 是在 Activator.CreateInstance 的上下文中完成的(使用 Windsor)

有点不高兴……

【问题讨论】:

  • 暂存环境是带有 .NET Core 2.1.4 的 Windows Server 2016
  • 如果目标DLL不在执行文件夹中,它是否存在于系统“Path”变量中?
  • 是的,我也试过了。但要清楚:dll 与可执行文件位于同一文件夹中。
  • 你考虑过二级依赖

标签: c# .net-core asp.net-core-2.0 dllimport


【解决方案1】:

正如 Thomas 所建议的,它与 c++ 运行时有关:如果当前可执行目录中都存在依赖项,则它适用于所有情况。有点令人困惑,因为它在某些情况下无需复制这些依赖项即可工作(可能是运行时安装的问题)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2020-07-16
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多