【问题标题】:WPF: A call to PInvoke function has unbalanced the stackWPF:对 PInvoke 函数的调用使堆栈不平衡
【发布时间】:2011-10-19 08:57:25
【问题描述】:

我在我的 .dll 参考中使用其中一种方法时遇到了这个错误。 当我调用 MyRef.SetDbaseId 方法时,我返回 VS 并出现此错误。我尝试添加 CallingConvention 枚举参数,但它们都不适合我。我还在 DependencyWalker 中打开了 dll 以检查适合我的应用程序的入口点和参数 (ulong)。这很令人困惑,因为其他方法也能正常工作。任何想法如何解决这个问题?

[DllImport("my.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?setdbaseid@@YGHK@Z")]
public static extern int SetDbaseID(ulong dbase_id);
ulong tmid = ulong.Parse(p_6);
i = MyRef.SetDbaseID(tmid);

【问题讨论】:

  • 你的声明是错误的。您无法准确猜测您做错了什么。本机代码中的 long 在 C# 中是 int。
  • 如果您必须使用 EntryPoint=?setdbaseid@@YGHK@Z,这意味着您的 dll 可能没有使用“extern C”声明来声明导出。据我所知,使用 dllimport 很难做到这一点。您是否使用过 dumpbin.exe /exports 来检查 dll 实际导出的内容?

标签: c# wpf dll .net-4.0 calling-convention


【解决方案1】:

错位名称 ?setdbaseid@@YGHK@Z 变位为:

 int __stdcall setdbaseid(unsigned long);

这使您的声明错误,本机代码中的无符号长整数是 32 位的。而且调用约定是错误的。修复:

[DllImport("my.dll", EntryPoint = "?setdbaseid@@YGHK@Z"))]
public static extern int SetDbaseID(uint dbase_id);

【讨论】:

  • 而且大概也改回stdcall而不是cdecl
  • @Hans Passant 这对我有用!你能告诉我你是如何破解这个外部方法的吗?有没有用什么特殊的工具?
  • 我从 Visual Studio 命令提示符运行了 undname.exe 工具。
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多