LoadLibraryW 调用在 IIS 上挂起

LoadLibraryW call hangs on IIS

我正在构建一个 MVC 5 网络应用程序,它对非托管库(通过 LoadLibraryW 函数加载)进行一些 P/Invoke 调用。

它在 visual studio 中与 IIS Express 一起运行良好,但是一旦我发布它并 运行 它与 IIS 的本地实例一起使用,对 LoadLibraryW 函数的调用将无限期挂起。

为确保问题不在我的非托管库中,我创建了一个新的 "dummy" 库,它在 DllMain 函数上只有一个简单的消息框,但它也挂起...

我尝试了很多东西,从在 AppPool 上启用 32 位,到更改 AppPool 用户等

AppPool 运行 处于集成模式,运行正在 Windows 10 机器上运行。

IIS 中是否有我缺少的任何类型的 p/invoke 调用配置或特殊权限?

我就是这样 P/Invoking LoadLibraryW 函数:

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
private static extern IntPtr LoadLibraryW(string fileName);

var moduleHandle = LoadLibraryW(@"c:\dll\interop.dll"); // This call hangs forever

这跟CAS有关系吗? AppPool .NET 信任级别设置为完全(内部),我什至将 AppPool 标识更改为 LocalSystem,所以我不明白。

有人经历过这种行为吗?

谢谢。

EDIT:我可以看到文件和 VC++ 运行time 库正在通过 Process Monitor 加载,我没有看到任何错误,这就是为什么这种行为很奇怪。

真正的问题在于我在 "real" 非托管库中有代码,该代码在没有写权限的情况下将文件保存到 %Temp% 文件夹中去做吧。

因为该操作没有引发任何类型的异常,只是默默地失败了,所以我花了一段时间才明白等待该操作成功的后续代码处于某种 "deadlock" 状态,所以 "hanging" 行为的原因。

现在,它在 IISExpress 下工作,因为正如@AdrianoRepetti 所说,IISExpress 在迭代会话模式下运行,因此 %Temp% 文件夹直接与登录用户相关联(在\Users{MyUser}\Local\Temp) ,因此具有该用户的写权限。

当 运行 在 IIS 下 %Temp% 文件夹变成 \Windows\Temp 文件夹,你就在那里需要给 IIS_USRS 组权限才能写入。

在试图找出问题所在时,我创建了一个 "dummy" 非托管库,它没有引导我进入正确的方向,而是让我认为问题与 P/Invoke 操作有关本身,因为这个 "dummy" 库也在 p/invoked 时挂起(但这是因为我在 DllMain 中的消息框代码只是警告我库已加载)。