PinvokeStackImbalance错误(C#)

col*_*mde 1 c# dll pinvoke .net-4.0 visual-studio-2010

我是Pinvoke的新手.

我有一个大型项目调用调用DLL调用vtmail.dll.它在.Net 3.5中运行良好,但在升级到.NET 4.0时我遇到了PinvokeStackImbalance异常

调用代码有点像这样:

VTMail vtMail = new VTMail();
ec = vtMail.SendMail("servername",
   false,
   "",
   "",
   "Subject",
   "Sender Name",
   "sender@mydomain.com",
   "",
   "sendto@theirdomain.com",
   "reply@mydomain.com,
   "Description",
   "foldername",
   false,
   25);
Run Code Online (Sandbox Code Playgroud)

检查vtmail.dll中的声明是这样的:

public int SendMail(string mailServer, bool login, string userName, 
                    string password, string subject, string fromName, 
                    string fromAddress, string toName, string toAddress, 
                    string replyToAddress, string bodyText, string folderToSend, 
                    bool encrypt, long smtpPortNo);
Run Code Online (Sandbox Code Playgroud)

我一直在搜索这个,它似乎是一个已知的.Net 4.0问题.响应总是建议添加CallingConvention=CallingConvention.CdeclDllImport语句中,但是这个特定的调用没有DllImport语句,dll只是作为Visual Studio中项目的引用而添加,因此可用.

我怎样才能解决这个问题?

Han*_*ant 5

    public int SendMail(..., long smtpPortNo);
Run Code Online (Sandbox Code Playgroud)

最后一个论证是不正确的.完全没有意义在64位长的参数中存储一个小于65536的值.肯定应该是int而不是.一个经典的Visual Basic事故,VB.NET用于Long声明32位整数之前的版本.

为什么这不会在3.5中产生诊断很难猜测,它肯定应该.也许您从未使用启用了MDA的调试器来运行它.获取声明错误导致的堆栈损坏有一种自我修复的习惯,因此它不一定要在运行时炸弹.仍然是一个非常非常不健康的问题,可能导致相当随机的代码执行.

你可以做三件基本的事情.在列表的顶部是使用电话,你希望这个库的作者修复他的错误.接下来尝试翻转忽略位并关闭MDA:Debug> Exceptions> Managed Debugging Assistants,取消勾选"PInvokeStackImbalance".我可能应该提到新的4.0配置文件选项<NetFx40_PInvokeStackResilience>,犹豫不决.

但是,真的,那个电话必须是你真正的解决方案.