2009-12-01 118 views
1

我想在.NET應用程序中利用新的Windows 7任務欄功能,並想知道人們認爲什麼是檢查.NET中Windows 7功能的最佳方法。我的目標是有不同的代碼,Windows XP和Windows 7.NET for Windows 7

我不是總體呈熱衷於:

  • 只是包裝的Windows 7的代碼在嘗試捕捉
  • 如果OS =「Windows 7」Then ...

除非當然這是大多數人正在做的事情。我真的已經到處尋找一個好的方法,但沒有成功。微軟非託管代碼包裝庫似乎只是假設它的運行在Windows 7上......

回答

4

我覺得有什麼不妥與if OS = "Windows 7」。當然,

  • 應該if OS >= "Windows 7"(所以它不會在Windows 7.1破裂或任何將成爲繼任者)和
  • 它應該通過檢查Environment.OSVersion(平臺和> =版本)來完成。

如果你不想if (isWindows7) {...}打亂您的代碼,你可能想要把特定於平臺的代碼放到一個單獨的類。佛[R例如,你可以創建一個接口

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

和這個類的兩個實現,一個爲> = Win 7的和一個爲別人(它在所有不同的東西或沒有)。當您的應用程序啓動時,您可以使用兩種實現中的任何一種來實例化IOSSpecific類型的某個全局變量。

2

我希望你做的事:

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

不知道Windows7的ID是什麼價值,但。

我通常會問這個問題來決定從我的工廠創建哪個對象來支持不同的平臺。比遍佈代碼庫或捕獲異常更好。

1

如果您使用類似Code Pack的包裝庫(http://code.msdn.microsoft.com/WindowsAPICodePack),它會爲您進行版本檢查。您繼續並調用庫方法,如果您在運行時嘗試某些不在OS上的操作,它將拋出PlatformNotSupportedException。

如果您是P /調用某些Windows DLL,您也可以捕獲EntryPointNotFoundException。這是進行自己的互操作時最好的方法,因爲從現在開始,低級操作系統可能會增加功能(通過更新和服務包)。

使用這兩種方法,您可以緩存某種標誌,提醒您沒有任務欄,或者沒有庫或者您沒有任何功能,以節省拋出和捕獲異常的性能。

如果你堅持做自己的版本檢查並看到你在哪個操作系統上,請記住> =的魔力。你知道有多少代碼在那裏測試的版本是正好 XP SP2,然後提出一個消息框說「需要XP SP2或更高版本」? A ton。事實上,這就是爲什麼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

凱特

+0

其實找到所有的主/次編號,該代碼將執行Vista的事情7.0,8.0和其他神祕的未來版本。大鼠,版本檢查很難!只有在確切知道主要版本時才能檢查次要版本。 – 2010-01-29 11:28:35