首页 > 解决方案 > Dll 未在 ASP.net Web Api 2.0 中加载

问题描述

我真的需要有人帮助。我有一个 ASP.Net Web Api 2.0 项目,我坚持将 Dll 加载到我的项目中。以下是详细信息:

加载Dll是用C++编写的,然后有一个.Net wrapper WrapperA,然后有另一个项目ProjectA,我们在其中调用.Net WrapperA,然后有Web Api调用ProjectA。

我收到的错误消息是:

托管调试助手“PInvokeStackImbalance”消息=托管调试助手“PInvokeStackImbalance”:“对 PInvoke 函数“CRM.Crypto!CryptOnAPI_Lib.CryptOnAPI::LoadLibrary”的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

LoadLibrary() 函数在 WrapperA 中定义为

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr LoadLibrary(string dllToLoad, IntPtr hFile, uint dwFlag);

在 web.config 文件中,我也提到了这个配置

<hostingEnvironment shadowCopyBinAssemblies="false"/>

我试图将所有 dll 放在 System32、inetsvr、IIS express 文件夹中,但没有任何效果。请注意,我有一个测试应用程序,它是一个用于测试 dll 的 Win Form 应用程序,并且 dll 在该应用程序中完美加载。

我已将所有 dll 放在 web API 项目的 bin 文件夹中。如果我从 bin 文件夹中删除 dll,我会收到与上述相同的错误消息。

请帮忙 :(

标签: asp.netasp.net-web-apivisual-studio-2017iis-expressunmanaged

解决方案


找到了我的问题的解决方案。我仍然无法使用 win32 dll 进行调试,但是当部署到 IIS 服务器时,它工作正常。解决方案是将 Dll 放在以下文件夹之一中:

C:\Windows\System32\inetsrv C:\Windows\SysWOW64\inetsrv

win32 dll 将加载到 Asp.Net Api 中。

干杯


推荐阅读