【问题标题】:Dll is not loading in ASP.net Web Api 2.0Dll 未在 ASP.net Web Api 2.0 中加载
【发布时间】: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


【解决方案1】:

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

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

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

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多