2009-10-04 125 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); 
}