2010-12-17 162 views
45

我開發了一個應用程序並將其安裝在客戶端計算機上。在我的應用程序中,我需要獲取它的安裝路徑。我的應用程序在註冊表項:讀取C#中的註冊表項#

HKEY_LOCAL_MACHINE\SOFTWARE\MyApplication\[AppPath] 

如何使用C#我讀AppPath

+1

使用微軟的術語,在你的問題中,'MyApplication'是* Key *,'AppPath'是* Value *。你問的是如何獲得與AppPath相關的* data *。 – DavidRR 2016-08-16 14:19:08

回答

24

看到這個http://www.codeproject.com/Articles/3389/Read-write-and-delete-from-registry-with-C

更新時間:

您可以在Microsoft.Win32命名空間使用RegistryKey類。是

RegistryKey一些重要的功能如下:

GetValue  //to get value of a key 
SetValue  //to set value to a key 
DeleteValue //to delete value of a key 
OpenSubKey  //to read value of a subkey (read-only) 
CreateSubKey //to create new or edit value to a subkey 
DeleteSubKey //to delete a subkey 
GetValueKind //to retrieve the datatype of registry key 
+0

改爲使用此[link](http://www.codeproject.com/Articles/3389/Read-write-and-delete-from-registry-with-C)。 – shipr 2015-04-28 22:14:01

70
string InstallPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\MyApplication\AppPath", "Installed", null);  
if (InstallPath != null) 
{ 
    // Do stuff 
} 

該代碼應該得到你的價值。你需要成爲

using Microsoft.Win32; 

爲了工作,雖然。

7

您可以使用以下方法來獲取其中的註冊表認爲它的安裝:

(string)Registry.LocalMachine.GetValue(@"SOFTWARE\MyApplication\AppPath", 
    "Installed", null); 

或者你可以使用下面的找出應用程序實際從推出:

System.Windows.Forms.Application.StartupPath 

如果您嘗試使用.exe位置作爲查找相關文件的相對路徑,則後者比前者更可靠。用戶可以在安裝後輕鬆移動,並且仍然可以正常工作,因爲.NET應用程序不依賴於註冊表。

使用StartupPath,您甚至可以做一些巧妙的事情,例如讓應用程序在運行時更新註冊表項,而不是由於丟失/錯誤/損壞的條目而導致崩潰。

而且一定要將應用程序設置功能看作存儲值而不是註冊表(Properties.Settings.Default.mySettingEtc)。您可以讀取/寫入應用程序的設置和/或在標準位置保存爲簡單MyApp.exe.config文件的用戶級別。從過去的一個不錯的爆炸(良好的舊的Win 3.1/DOS的日子)讓應用程序安裝/刪除是一個簡單的複製/刪除一個或兩個文件夾結構,而不是一些複雜的,神祕的安裝/卸載例程,留下各種垃圾在註冊表中並撒滿硬盤。

+0

同樣,這些可以在努力中有用:'Environment.CommandLine'和'Environment.GetCommandLineArgs()' – 2013-03-30 17:58:02

+1

這也適用:System.AppDomain.CurrentDomain.BaseDirectory – 2013-05-17 17:58:09

+0

使用System.Reflection:Assembly.GetExecutingAssembly() .Location將獲得完整路徑,然後System.IO.Path.GetDirectoryName選擇父文件夾。 – 2013-05-17 18:49:49

5

如果您希望將其轉換爲特定類型,則可以使用此方法。大多數非基元類型默認情況下不支持直接投射,因此您必須相應處理這些類型。

public T GetValue<T>(string registryKeyPath, string value, T defaultValue = default(T)) 
    { 
    T retVal = default(T); 

     retVal = (T)Registry.GetValue(registryKeyPath, value, defaultValue); 

     return retVal; 
    } 
+0

這很好。用法示例:'int loopback = GetValue (@「HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa」,@「DisableLoopbackCheck」,-1);'。 – Contango 2014-10-07 15:16:52

1

using Microsoft.Win32;

string chkRegVC = "NO"; 
    private void checkReg_vcredist() { 

     string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
     using (Microsoft.Win32.RegistryKey uninstallKey = Registry.LocalMachine.OpenSubKey(regKey)) 
     { 
      if (uninstallKey != null) 
      { 
       string[] productKeys = uninstallKey.GetSubKeyNames(); 
       foreach (var keyName in productKeys) 
       { 

        if (keyName == "{196BB40D-1578-3D01-B289-BEFC77A11A1E}" ||//Visual C++ 2010 Redistributable Package (x86) 
         keyName == "{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}" ||//Visual C++ 2010 Redistributable Package (x64) 
         keyName == "{C1A35166-4301-38E9-BA67-02823AD72A1B}" ||//Visual C++ 2010 Redistributable Package (ia64) 
         keyName == "{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}" ||//Visual C++ 2010 SP1 Redistributable Package (x86) 
         keyName == "{1D8E6291-B0D5-35EC-8441-6616F567A0F7}" ||//Visual C++ 2010 SP1 Redistributable Package (x64) 
         keyName == "{88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}" //Visual C++ 2010 SP1 Redistributable Package (ia64) 
         ) { chkRegVC = "OK"; break; } 
        else { chkRegVC = "NO"; } 
       } 
      } 
     } 
    }