2009-10-04 72 views
1

*或者:「我應該存儲我的設置的位置是否在%#%/?」Application.UserAppDataRegistry和版本號

爲什麼Application.UserAppDataRegistry註冊表項中包含產品版本號?我認爲這真的很煩人。

這不僅僅是鼓勵開發者永遠堅持版本號1.0.0,因爲更改版本號會導致用戶失去所有設置(除非額外付出努力)?

如果我剝離版本號,它當然會工作得更好(我看到它的方式),但是框架仍然使用版本號創建註冊表項。

我在監督什麼?

回答

1

我認爲這是IsolatedStorage的目的。這裏是一些VB代碼示例:

Public Shared Sub SaveGridLayout(ByVal grd As Infragistics.Win.UltraWinGrid.UltraGrid, ByVal sPrefix As String) 
    Dim isf As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication() 
    Dim userDataFile As IsolatedStorageFileStream = New IsolatedStorageFileStream("ClearTrac" + sPrefix + ".dat", FileMode.Create, isf) 
    grd.DisplayLayout.Save(userDataFile) 
    userDataFile.Flush() 
    userDataFile.Close() 
End Sub 

如果使用使用GetUserStoreForApplication,它不是版本特定的。

0

我認爲版本號在那裏,以便用戶可以安裝2個版本的應用程序並排運行它們。除此之外,當版本號發生變化時,我沒有看到丟失所有配置的理由。

就個人而言,我通常使用的配置文件堅持配置信息,避免windows的註冊表

+0

如果我真的需要並排端的支持,我寧願做額外的工作,而不是其他方式...... :-( 但是,你得到了與Application.UserAppDataPath相同的問題?寫入應用程序的安裝目錄會導致Vista下的麻煩......所以,你把你的配置文件? – 2009-10-04 09:53:05

+0

我p將程序文件中的配置文件綁定到以我的應用程序命名的文件夾中。開發人員經常將配置文件存儲在其調試目錄中,以便它們可以具有不同的配置。建議客戶備份程序文件,以便在配置失敗時,在調用技術支持前迅速恢復。 – 2009-10-05 00:56:31

+1

我認爲這就是darbystrom在談論它會在Vista下引發問題時所說的。特別是,如果你的用戶沒有管理權限,當他/她運行你的程序時,當配置文件位於程序文件下時,它將不能保存它們的配置。最好將它放在%ALLUSERSPROFILE%下,如果你的配置是基於每臺機器的話,或者%LOCALAPPDATA%是根據每個用戶的話。對於您的應用在運行時修改的任何其他文件也一樣。 – RobH 2009-10-19 19:27:10

0

這可以讓你改變什麼設置存儲從一個版本到另一個。如果1.0.0版本設置了「foo」,並且在2.0.0版本中,您仍然將1.0.0/foo中的內容分爲2.0.0/foo和2.0.0/bar。您的安裝程序/配置嚮導需要檢查以前版本的設置分支並將其轉換爲新版本的設置。但請注意,您需要直接訪問存儲庫以獲取以前的版本。

+0

它確實應該是相反的。如果我發佈一個bug修復爲1.0.1,我不應該經歷所有這些麻煩。我不想爲此創建一個新的安裝程序。我應該如何處理舊的1.0.0設置?刪除它們或將它們留在註冊表中永恆?如果我刪除它們並且用戶意識到我的1.0.1不滿意並且希望繼續使用1.0.0,直到我可以給他一個1.0.2?我認爲M $有人在這裏沒有清楚地思考。 – 2009-10-25 08:37:32

3

爲什麼他們不只是提供: UserAppDataRegistryVersionSpecific和UserAppDataRegistryGlobal 然後開發人員可以決定他們更喜歡特定項目/特定設置其中之一。

順便說一句,有一個簡單的解決方法:

string VersionIndependentRegKey { 
    get { 
    string versionDependent = System.Windows.Forms.Application.UserAppDataRegistry.Name; 
    string versionIndependent = 
      versionDependent.Substring(0, versionDependent.LastIndexOf("\\")); 
    return versionIndependent; 
    } 
} 
object GetRegistryValue(string name, object defaultValue) { 
    return Registry.GetValue(VersionIndependentRegKey, name, defaultValue); 
} 
object GetRegistryValue(string name) { 
    return GetRegistryValue(name, null); 
} 
void SetRegistryValue(string name, object value, RegistryValueKind kind) { 
    Registry.SetValue(VersionIndependentRegKey, name, value, kind); 
} 
1

這裏的另一種方式,我用它來選擇性剔除版本:

if (Include_Version == true) 
{ 
    rootRegKey = Application.UserAppDataRegistry; 
} 
else 
{ 
    regKey = Application.UserAppDataRegistry.Name; 
    rootRegKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(regKey.Substring(regKey.IndexOf("\\") + 1, regKey.LastIndexOf("\\") - regKey.IndexOf("\\") - 1), true); 
}