2011-01-07 54 views
1

我想獲取安裝在我的機器中的軟件的版本號......是否有可能在C#中使用Registry類?如何從註冊表中檢索已安裝的應用程序版本?

 RegistryKey regKey; 

    public void ReadReg() 
    { 
     regKey = Registry.LocalMachine; 
     RegistryKey sk= regKey.OpenSubKey("SOFTWARE\\"); 
     string[] subKeys = sk.GetSubKeyNames(); 

     foreach (string sub in subKeys) 
     { 
      Console.WriteLine(sub); 
     }    
    } 
+1

什麼軟件有趣? – Oleg 2011-01-07 10:16:57

+0

@Oleg必須是德國人在這裏;-) – 2011-01-07 10:17:59

+1

@Uwe Keim:謝謝Uwe!它是固定的。 – Oleg 2011-01-07 10:20:38

回答

3

安裝人員存儲產品信息時,沒有標準且通常可訪問的位置。但是,安裝程序數據庫確實包含此信息(其中產品直接或間接使用MSI —),並且此信息可通過WMI獲得。

WMI也可以從.NET中使用System.Management類型。查詢:

select name,version from Win32_Product 

將樣本here修改爲該查詢不應該太難。

1

你要看什麼關鍵,以及如何確定它是一個版本號?沒有保證,因爲它將從供應商變爲供應商。

另一種方法是枚舉您的計算機上的可執行文件(在C:\Program Files\說和它的子文件夾),並使用FileVersionInfo提取從可執行文件本身的版本信息:

FileVersionInfo fi = FileVersionInfo.GetVersionInfo("yourexe.exe"); 
+0

但用戶可以在任何地方安裝軟件? – 2011-01-07 11:23:19

0

您可以獲得版本 -

string version = sk.GetValue("Version"); 

如果Version鍵可用,它將返回值,否則它將返回null。

1

無法保證您可以在註冊表中找到有關程序的版本信息。我確實使用註冊表鍵 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\programname 查找完整路徑,但它仍然依賴於設置/安裝程序來設置此值。如果使用此慣例足夠好,則可以使用完整路徑呼叫GetFileVersionInfo(...)

開發人員需要填寫版本,公司名稱,說明,版權等有用的資源信息...... 您可以告訴某些程序在資源中具有舊的默認「待辦事項」佔位符。其他人,甚至微軟,都會忘記將公司名稱包含在Dumprep等程序的資源中。在沒有Visual Studio的情況下創建的其他Exe不會包含可通過GetFileVersionInfo()訪問的任何資源段。

最終,我發現這個功能是最可靠的。還請注意,在致電GetFileVersionInfo()之前,請確保您致電GetFileVersionSize()。 如果它是Windows的x64版本,在某些情況下,如果您正在查看的程序位於重定向的系統文件夾中,則可能需要撥打Wow64DisableWow64FsRedirection(...) & Wow64RevertWow64FsRedirection(...)或使用SysNative。

相關問題