【发布时间】: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