我将我的项目从VS2005(目标.net 2)更新到VS2010(目标.net4)。似乎pInvokeStackImbalance MDA默认启用,然后我得到一堆"unbalanced the stack"
例外。以此为例:
[DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateSolidBrush(BrushStyles enBrushStyle, int crColor);
它在.net 2中工作,但现在它抛出了异常。我把它改成了它,它起作用了:
[DllImportAttribute("gdi32.dll", CallingConvention = CallingConvention.ThisCall)]
private static extern IntPtr CreateSolidBrush(BrushStyles enBrushStyle, int crColor);
令我惊讶的是,pinvoke.net将其列为
[DllImport("gdi32.dll")]
static extern IntPtr CreateSolidBrush(uint crColor);
为什么我的老人不工作?似乎pinvoke.net是错误的但是如何在win32函数下找出它的调用转换?
修改
我的项目使用C# Rubber Rectangle中的代码进行XOR绘图。显然,代码需要修复才能在.Net 4中工作。
答案 0 :(得分:3)
CreateSolidBrush
使用stdcall
。几乎所有Win32 API都这样做。他们从不使用thiscall
。该函数声明为:
HBRUSH CreateSolidBrush(
__in COLORREF crColor
);
所以你的错误只是你的版本有太多的参数。您找到的pinvoke.net声明是正确的。
stdcall
约定从右到左推送params,这解释了即使使用额外的虚假参数,代码也能如何工作。