gpt4 book ai didi

c# - LoadLibraryW 调用在 IIS 上挂起

转载 作者:太空狗 更新时间:2023-10-29 23:01:06 30 4
gpt4 key购买 nike

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

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

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

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

AppPool 以集成模式运行,并且在 Windows 10 机器上运行。

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

这就是我 P/调用 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,所以我不明白。

有人经历过这种行为吗?

谢谢。

编辑:我可以看到文件和 VC++ 运行时库正在通过 Process Monitor 加载,我在那里没有看到任何错误,这就是为什么这种行为很奇怪。 enter image description here

最佳答案

真正的问题在于我在“真正的”非托管库中有代码,该库将文件持久保存到 %Temp% 文件夹中,但没有写入权限。

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

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

当在 IIS 下运行时,%Temp% 文件夹变成了 \Windows\Temp 文件夹,您需要在其中授予 IIS_USRS 组写入权限。

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

关于c# - LoadLibraryW 调用在 IIS 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881887/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com