【发布时间】: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 是的,我会按照你说的去做,如果我发现原因,我会在这里发布,以便给出更完整的答案。谢谢!
标签: c# c++ asp.net-mvc iis pinvoke