【发布时间】:2013-02-06 09:38:55
【问题描述】:
在 .NET 4.0 -> .NET 4.5 应用程序迁移过程中,我发现了一个非常奇怪的行为。我已经能够将此问题追溯到这个短代码 sn-p:
class Program
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int GetSystemMetrics(int nIndex);
static void Main(string[] args)
{
const int CXFRAME = 0x20;
const int CYFRAME = 0x21;
var dx = GetSystemMetrics(CXFRAME);
var dy = GetSystemMetrics(CYFRAME);
Console.WriteLine("{0}x{1}", dx, dy);
Console.ReadKey();
}
}
当使用Target Framework = 4.0(以及2.0、3.0、3.5)编译时,它会输出8x8
使用Target Framework = 4.5编译时,输出4x4
使用 MSVS2012 调试器运行此示例也始终输出 4x4(使用 any 目标框架)。
其他选项(目标框架配置文件、目标平台、启用/禁用 Aero)不会影响结果,改变输出的唯一因素是目标框架和使用调试器运行。我已经能够在 3 台计算机上重现此问题,不幸的是它们在安装的软件方面几乎相同:
- Windows 7 Ultmate SP1(俄语,已安装所有更新)和 MSVS2012(英语/俄语)更新 1
- Windows 8(在虚拟机上)
目前我正在考虑修补一些 .NET 类(例如 SystemParameters),它们使用反射调用 GetSystemMetrics(),但我不确定如何获得正确的指标值。
问题:
- 我错过了什么吗?
GetSystemMetrics()怎么会受到目标框架的影响? - 有什么方法可以从 .NET 4.5 应用调用
GetSystemMetrics()并获得正确的结果?
我愿意接受有关解决此问题的任何建议。另外,如果您无法重现该问题,请在 cmets 中留下简短的系统描述。
【问题讨论】:
标签: c# .net-4.0 .net-4.5 getsystemmetrics