Při vývoji mobilních aplikací (aplikace pro Windows Mobile 5.x, 6.x nebo Windows CE) určitě narazíte na to, že zcela chybí podpora pro My.Settings - Visual Studiem (Visual Basicem) vytvořený kód pro přístup ke konfiguračním hodnotám vizuálně naklikaným ve vlastnostech projektu. Důvod proč to u mobilních aplikací není nechápu, stejně jako chybějící My.Application.Info, ze kterého jsou přístupné často používané položky jako např. ProductName (používám jako text záhlaví TaskDialogů/MessageBoxů).
Řešením je napsat jednoduchý modul a pro přístup ke konfiguračnímu XML souboru použít Smart Devices Framework, nepostradatelný soubor knihoven pro mobilní vývojáře. Konfigurační soubor je nejlepší pojmenovat stejně jako u desktopových aplikací (*.exe.config) a umístit ho do složky s programem. Vzhledem k tomu, že u mobilních Windows je pouze jeden uživatelský účet, nemá smysl řešit konfigurační hodnoty specifické pro jednotlivé uživatele. Bude pouze jeden konfigurační soubor pro celou aplikaci, ale narozdíl od desktopových aplikací může být i pro zápis (neřeší se ACL u složky Program Files). Formát konfiguračního souboru je téměř identický s desktopovou verzí, ale drobné odlišnosti tam jsou.
Ukázkový SmartDeviceApplication1.exe.config:
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile>
<SettingsGroups>
<group name='Ftp' />
</SettingsGroups>
<Ftp>
<Host>
<Type>System.String</Type>
<Value>169.254.0.2</Value>
</Host>
<Port>
<Type>System.Int32</Type>
<Value>22</Value>
</Port>
</Ftp>
</SettingsFile>
Modul pro přístup k nastavením (potom se kdekoliv v aplikaci používá pomocí My.Settings.*):
Imports OpenNETCF.AppSettings
Imports System.IO
Imports System.Reflection
Namespace My
Friend Module Settings
Private _configFilePath As String
Private _host = "169.254.0.1"
Private _isLoaded As Boolean
Private _port = 21
ReadOnly Property ConfigFilePath() As String
Get
If _configFilePath Is Nothing Then
Dim codeBase = Assembly.GetExecutingAssembly().GetName().CodeBase
_configFilePath = Path.Combine(Path.GetDirectoryName(codeBase), _
Path.GetFileName(codeBase) & ".config")
End If
Return _configFilePath
End Get
End Property
Property Host() As String
Get
If Not _isLoaded Then Reload()
Return _host
End Get
Set (ByVal value As String)
_host = value
End Set
End Property
Property Port() As Integer
Get
If Not _isLoaded Then Reload()
Return _port
End Get
Set (ByVal value As Integer)
_port = value
End Set
End Property
Sub Reload()
If Not File.Exists(ConfigFilePath) Then Save()
Dim configFile As New SettingsFile(ConfigFilePath)
With configFile.Groups("Ftp")
_host = DirectCast(.Settings("Host").Value, String)
_port = DirectCast(.Settings("Port").Value, Integer)
End With
_isLoaded = True
End Sub
Sub Save()
Dim configFile As New SettingsFile(ConfigFilePath)
With configFile.Groups("Ftp")
.Settings("Host").Value = _host
.Settings("Port").Value = _port
End With
configFile.Save()
End Sub
End Module
End Namespace
Do projektu je nutné přidat referenci na soubor OpenNETCF.AppSettings.dll ze SDF. Při potřebě nové konfigurační hodnoty se musí přidat nové vlastnosti do modulu Settings, komfort naklikávání vlastností je nutné oželit.