LoadLibraryW调用在IIS上挂起

时间:2015-08-07 15:50:45

标签: c# c++ asp.net-mvc iis pinvoke

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

在Visual Studio中使用IIS Express可以很好地工作,但是一旦我发布它并使用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 Trust Levels设置为Full(内部),我甚至将AppPool身份更改为LocalSystem,所以我不明白。

有人遇到过这种行为吗?

谢谢。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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