我的项目在.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)
您知道如何解决此错误吗?
答案 0 :(得分:40)
将其与dll import一起添加。
, CallingConvention = CallingConvention.Cdecl)]
取自here。
平台调用
提高与互操作性的性能 非托管代码,平台中调用约定不正确现在调用 导致应用程序失败。在以前的版本中,编组 layer将这些错误解决了堆栈。
调试您的应用程序 在Microsoft Visual Studio 2010中将提醒您这些错误,以便您 可以纠正它们。如果您有无法更新的二进制文件,则可以 包括你的元素 应用程序的配置文件以启用调用错误 像早期版本一样解决了堆栈问题。但是,这可能会影响 你的申请表现。
答案 1 :(得分:0)
我在导入DLL的同时添加了CallingConvention.ThisCall,
请尝试其他常量,并检查哪个常量在您的环境中有效