当进程未在当前目录中启动时无法加载 DLL (.NET Core 2.1.4)
Unable to load DLL when process not started in the current directory (.NET Core 2.1.4)
这是一个加载 C++ dll (DllImport) 的 .NET Core 2.0 控制台应用程序。它 "works on my machine" (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
w/o 任何效果。
总结一下:
- 如果应用程序是使用
dotnet ***.dll
从 CLI 启动的,它可以在任何目录下运行
- 如果使用
Process.Start()
从另一个进程以同样的方式启动应用程序,它会失败
- 如果应用程序作为可执行文件发布,它可以使用当前目录中的 CLI 运行
- 但是它从父目录失败了,当然,也使用了
Process.Start()
(这是最终用例)
最后一个细节:DllImport
是在 Activator.CreateInstance
的上下文中完成的(使用 Windsor)
有点不爽...
正如 Thomas 所建议的,它与 c++ 运行时有关:如果依赖项全部存在于当前可执行目录中,它在所有情况下都有效。有点混乱,因为它在某些情况下无需复制这些依赖项就可以工作(可能是运行时安装的问题)
这是一个加载 C++ dll (DllImport) 的 .NET Core 2.0 控制台应用程序。它 "works on my machine" (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
w/o 任何效果。
总结一下:
- 如果应用程序是使用
dotnet ***.dll
从 CLI 启动的,它可以在任何目录下运行 - 如果使用
Process.Start()
从另一个进程以同样的方式启动应用程序,它会失败 - 如果应用程序作为可执行文件发布,它可以使用当前目录中的 CLI 运行
- 但是它从父目录失败了,当然,也使用了
Process.Start()
(这是最终用例)
最后一个细节:DllImport
是在 Activator.CreateInstance
的上下文中完成的(使用 Windsor)
有点不爽...
正如 Thomas 所建议的,它与 c++ 运行时有关:如果依赖项全部存在于当前可执行目录中,它在所有情况下都有效。有点混乱,因为它在某些情况下无需复制这些依赖项就可以工作(可能是运行时安装的问题)