1

我想在 .NET 应用程序中利用新的 Windows 7 任务栏功能,并想知道人们认为在 .NET 中检查 Windows 7 功能的最佳方法是什么。我的目标是为 Windows XP 和 Windows 7 提供不同的代码。

我并不热衷于:

  • 只是将 Windows 7 代码包装在 try catch 中
  • 如果操作系统 =“Windows 7”那么...

当然,除非这是大多数人正在做的事情。我真的到处寻找一个好的方法,但没有成功。Microsoft 非托管代码包装库似乎只是假设它在 Windows 7 上运行......

4

3 回答 3

4

我认为“没有什么问题if OS = "Windows 7。当然,

  • 它应该是if OS >= "Windows 7"(这样它就不会在 Windows 7.1 或任何后续版本中中断)和
  • 应该通过检查Environment.OSVersion (Platform and >= Version) 来完成。

如果您不想让代码混乱if (isWindows7) {...},您可能希望将特定于平台的代码放入一个单独的类中。例如,您可以创建一个接口

interface IOSSpecific {
    void AddToJumpList(...);
    ...
}

以及此类的两种实现,一种用于 >= Win 7,另一种用于其他(执行不同的操作或根本不执行任何操作)。IOSSpecific当您的应用程序启动时,您使用两种实现中的任何一种来实例化一些类型的全局变量。

于 2009-12-01T14:53:47.687 回答
2

我希望你这样做:

if ( Environment.OSVersion.Platform == windows7Id)
{
    // win7 stuff
}

不知道 Windows7 id 是什么值。

我通常会问这个问题来决定我从工厂创建哪个对象来支持不同的平台。比将这些洒在代码库中或捕获异常要好。

于 2009-12-01T14:43:53.800 回答
1

如果您使用像 Code Pack ( http://code.msdn.microsoft.com/WindowsAPICodePack ) 这样的包装库,它会为您检查版本。您继续调用库方法,如果您在运行时尝试不在操作系统上的东西,它将抛出 PlatformNotSupportedException。

如果您正在 P/Invoking 某些 Windows DLL,您还可以捕获 EntryPointNotFoundException。这是进行您自己的互操作时的最佳方法,因为功能可能会在几年后(通过更新和服务包)添加到低级操作系统中。

使用这两者,您可以缓存某种标志,提醒您没有任务栏或没有库或您没有任何功能,以节省抛出和捕获异常的性能命中。

如果您坚持自己进行版本检查并查看您使用的操作系统,记住 >= 的魔力。您知道有多少代码可以测试版本正是XP SP2,然后显示“需要 XP SP2 或更高版本”的消息框吗?一。事实上,这就是 Win7 的主要版本是 6 的原因——因此所有检查“等于 6”的代码仍然可以工作。不要成为那个人。

if (Environment.OSVersion.Version.Major >= 6)
{
   if (Environment.OSVersion.Version.Minor >= 1)
     // Do Win7 thing
   else
     // Do Vista thing
}
else if (Environment.OSVersion.Version.Major >= 5)
 // Do XP thing

您可以在http://msdn.microsoft.com/en-us/library/ms724832%28VS.85%29.aspx找到所有主要/次要数字

凯特

于 2010-01-28T14:15:02.003 回答