我有一个小型测试项目,用于检查服务器的应用程序版本并提示用户更新。一切正常,但我无法将System.Version
类型保存到My.Settings
。 (我想保存新版本以防用户请求不再提醒它。)
现在,我知道我可以将版本保存为字符串并来回转换 - 我已经做了解决这个问题 - 但是当System.Version
列在可用的设置数据类型中时,我想它应该管用。但是它不是保存版本,而是仅保存没有值的XML条目“Version”(参见下文)。
我正在使用VB.NET,VS 2013,.NET 4。
以下是一些要查看的代码:
Settings.Designer.vb
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property DoNotRemindVersion() As Global.System.Version
Get
Return CType(Me("DoNotRemindVersion"),Global.System.Version)
End Get
Set
Me("DoNotRemindVersion") = value
End Set
End Property
示例分配
If My.Settings.DoNotRemind Then My.Settings.DoNotRemindVersion = oVersion.NewVersion
(oVersion.NewVersion
的类型为System.Version
。)
保存在user.config中
<setting name="DoNotRemindVersion" serializeAs="Xml">
<value>
<Version xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</value>
</setting>
那么,我做错了什么?我已经阅读了一些关于必须序列化类以将它们保存到用户设置的帖子,但这是一个简单的版本号,从表面上看,我希望它是一种受支持的数据类型。
答案 0 :(得分:2)
System.Version Class标有SerializableAttribute
,但您需要使用SettingsSerializeAsAttribute标记该属性并传递System.Configuration.SettingsSerializeAs.Binary值。
您无法使用项目设置设计器界面自动生成您在Settings.designer.vb
文件中找到的代码。您需要自己扩展My Namespace - MySettings类。这是部分类有用的领域之一。
将新的类文件添加到项目中,并将名称设置为CustomMySettings。选择并删除此新文件中的自动生成代码,并将其替换为以下代码。
Namespace My
Partial Friend NotInheritable Class MySettings
' The trick here is to tell it serialize as binary
<Global.System.Configuration.SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Binary)> _
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property DoNotRemindVersion() As Global.System.Version
Get
Return CType(Me("DoNotRemindVersion"), Global.System.Version)
End Get
Set(value As Global.System.Version)
Me("DoNotRemindVersion") = value
End Set
End Property
End Class
End Namespace
这将允许您使用My.Settings.DoNotRemindVersion
,就像您通过设计师创建设置一样。第一次访问该设置时,它将具有null(Nothing)值,因此您可以使用Form.Load事件处理程序中的以下内容对其进行初始化。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim savedVersion As Version = My.Settings.DoNotRemindVersion
If savedVersion Is Nothing Then
My.Settings.DoNotRemindVersion = New Version(1, 0)
My.Settings.Save()
End If
End Sub