当进程未在当前目录中启动时无法加载DLL(.NET Core 2.1.4)

时间:2018-03-28 17:05:45

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

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

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

我尝试在SetCurrentDirectory方法中添加SetDllDirectory + Main无任何效果。

总结:

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

最后一个细节:DllImport是在Activator.CreateInstance(使用Windsor)

的上下文中完成的

有点不高兴......

1 个答案:

答案 0 :(得分:0)

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