升级到 .NET Framework 后 64 位 Windows Server 2012 中出现溢出错误?

Overflow Errors in 64-bit Windows Server 2012 after Upgrade to .NET Framework?

我们的解决方案最近从 .NET Framework v3.5 升级到 v4.5.2,因此我们在 Windows Server 2012 64 位机器上遇到了一些溢出错误 运行。

这些溢出错误似乎来自我们从 Windows API:

调用此函数的任何实例
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);

发生溢出是因为在某些情况下,对于 lParam,无论出于何种原因,它被传递给一个 int 而不是 IntPtr,即使该函数需要一个 IntPtr。

有趣的是,这些问题仅在升级 .NET 后出现,并且仅出现在 Windows Server 2012 64 位计算机上。

我正试图破译仅在这些情况下才会发生这种情况的原因,并试图找到一种有效的方法来查找可能发生此类溢出错误的其他实例。

我的第一个想法是查找所有调用 SendMessage 的实例,但这可能会遗漏一些其他 IntPtr 被滥用的实例。我的另一个想法是使用 ReSharper 或 FXCop 来检测这类实例并提醒我注意它们,但我不知道如何或是否可能,并且默认情况下 ReSharper 不会提出任何投诉。

您应该使用 IntPtr 而不是 int,因为 SendMessage 函数的最后两个参数是指针。请参阅 Windows Data Types 关于 WPARAMLPARAM 类型。

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);