【发布时间】:2019-06-12 07:18:35
【问题描述】:
在我们的 ASP.NET Core Web api 中,我们尝试从包含在已发布文件夹中的 DLL 加载非托管 C++ 代码。
调用加载 DLL 的端点时失败。例外情况如下:
DllNotFoundException: Unable to load DLL 'libespeak-ng' or one of its dependencies: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
应该注意,当应用程序通过 Visual Studio 运行时,此 DLL 加载和运行正常。使用 dotnet 命令在 Kestrel 中运行应用程序也可以在同一台服务器上正常运行。应用程序无法加载此 DLL 只是在 IIS 内部。
我们已确保 IIS 用户(以及默认应用程序池)具有读取和执行 DLL 的权限。我们尝试将 DLL 放在 app bin 文件夹、System32、SysWOW64 和各种 inetsrv 目录中。这些都没有解决问题。
查看 ProcMon,似乎 IIS 甚至没有尝试加载 DLL。 Dependency Walker 不会显示任何丢失的依赖项,而在任何机器上使用 Kestrel 运行它时也不会丢失。
【问题讨论】:
-
你试过注册dll吗? 32 位运行
regsvr64或regsvr32? -
@AntonToshik 运行似乎没有产生任何错误,尽管它也不能解决问题。
-
您的 DLL 是 32 位还是 64 位?它是否与在 VS 下您的 dotnet 核心二进制文件以 32 位运行因此能够加载 DLL 而在 IIS 下它将以 64 位运行并且无法加载它的事实相关联?此外,哪个用户帐户用于使用 IIS 和直接使用 Ketrel 的二进制文件?如果不同,是否可以尝试强制 IIS 使用相同的用户帐户?
-
@Daboul 我现在已经强制项目构建为 64 位,但仍然无法解决问题。我可以确认 IIS 运行的是 64 位,DLL 也是 64 位。
-
此外,哪个用户帐户用于使用 IIS 和直接使用 Ketrel 的二进制文件?如果不同,是否可以尝试强制 IIS 使用相同的用户帐户?
标签: c# iis asp.net-core