对PInvoke函数的调用使堆栈失衡。这很可能是因为托管的PInvoke ..(.NET 4)

时间:2013-12-04 10:31:14

标签: c# .net pinvoke

我的项目在.NET Frame 3.5中成功运行且没有错误。但是,当我将它定位到.NET Frame工作时4.我得到了错误:

对PInvoke函数的调用使堆栈失衡。这可能是因为托管的PInvoke签名与非托管目标签名不匹配。

我使用了非托管库,如下所示:

[StructLayout(LayoutKind.Sequential )]
public class DGNElemCore
{
    public int offset;
    public int size;
    public int element_id;
    public int stype;          
    public int level;
    public int type;
    public int complex;
    public int deleted;
    public int graphic_group;
    public int properties;
    public int color;
    public int weight;
    public int style;
    public int attr_bytes;       
    public IntPtr attr_data;  
    public int raw_bytes;
    public IntPtr raw_data;                 

}

[DllImport("DgnLib.dll", EntryPoint = "DGNOpen")]           
public static extern IntPtr  DGNOpen(string fileName, int bUpdate)

您知道如何解决此错误吗?

2 个答案:

答案 0 :(得分:40)

将其与dll import一起添加。

, CallingConvention = CallingConvention.Cdecl)]

取自here

  

平台调用

     

提高与互操作性的性能   非托管代码,平台中调用约定不正确现在调用   导致应用程序失败。在以前的版本中,编组   layer将这些错误解决了堆栈。

     

调试您的应用程序   在Microsoft Visual Studio 2010中将提醒您这些错误,以便您   可以纠正它们。如果您有无法更新的二进制文件,则可以   包括你的元素   应用程序的配置文件以启用调用错误   像早期版本一样解决了堆栈问题。但是,这可能会影响   你的申请表现。

答案 1 :(得分:0)

我在导入DLL的同时添加了CallingConvention.ThisCall,

请尝试其他常量,并检查哪个常量在您的环境中有效