LoadLibraryW 调用在 IIS 上挂起

Posted

技术标签:

【中文标题】LoadLibraryW 调用在 IIS 上挂起【英文标题】:LoadLibraryW call hangs on IIS 【发布时间】:2015-08-07 15:50:45 【问题描述】:

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

在带有 IIS Express 的 Visual Studio 中一切正常,但是一旦我发布它并使用 IIS 的本地实例运行它,对 LoadLibraryW 函数的调用就会无限期挂起。

为了确保问题不在于我的非托管库,我创建了一个新的“虚拟”库,在 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,所以我不明白。

有人经历过这种行为吗?

谢谢。

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

【问题讨论】:

消息框?它绝对不适用于具有非交互式用户的 IIS。也有调用非托管代码的权限。 @Adriano Repetti 为什么它会显示在 IISExpress 上?我的意思是,你可以将你想要的代码放在 DllMain...它挂起... 没有消息框你应该检查你是否有权限在完全信任的情况下运行。一些服务提供商在默认情况下仍然使用中等信任,即使现在 ASP.NET 强制要求完全信任 答案太差了,实际上并没有回答您的原始问题。可能是,但很难说。您可以使用 Process Explorer 在 IIS Express 中检查您的原始 dll,您会看到它是否打开了 UI 的一些句柄或什么(原因可能是多个,例如访问权限) @AdrianoRepetti 是的,我会按照你说的去做,如果我发现原因,我会在这里发布,以便给出更完整的答案。谢谢! 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于LoadLibraryW 调用在 IIS 上挂起的主要内容,如果未能解决你的问题,请参考以下文章

闪亮的响应式 UI 在同一条件变量上挂起多个 uiOutput 调用

AVAssetReaderTrackOutput 在 copyNextSampleBuffer 上挂起

Velocity JS 在 iPad 上挂起

Heroku CLI 在 Windows 10 上挂起

Composer 在 4.2 上挂起“通过 SAT 解决依赖关系”

NSURLSession 在 iOS 7.0.x 上挂起