【发布时间】:2018-12-21 11:12:01
【问题描述】:
我真的需要有人帮助。我有一个 ASP.Net Web Api 2.0 项目,我坚持将 Dll 加载到我的项目中。以下是详细信息:
加载Dll是用C++编写的,然后有一个.Net wrapper WrapperA,然后有另一个项目ProjectA,我们在其中调用.Net WrapperA,然后有Web Api调用ProjectA。
我得到的错误信息是:
托管调试助手“PInvokeStackImbalance” Message=Managed Debugging Assistant '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,我会收到与上述相同的错误消息。
请帮忙:(
【问题讨论】:
-
这是否有效,例如在您的开发 PC 上,但在生产中失败?
-
@Kev 它从来没有用过......
-
好的...如果您可以访问源代码,查看库的
LoadLibrary方法签名会很有用。 -
@Kev 我已经提到了有问题的方法签名。
-
是的...但那是您的 .NET 互操作签名,可能不正确。我们需要查看实际的 C++ 方法签名本身。您是否尝试过打开一个简单的 C# 控制台应用程序来测试这一点,以便您可以消除 IIS 作为可能的原因(不太可能,但并非不可能)。
标签: asp.net asp.net-web-api visual-studio-2017 iis-express unmanaged