2009-06-25 6 views
4

Le code suivant a deux défauts, je ne peux pas comprendre s'il s'agit de bugs ou par conception. D'après ce que j'ai vu, il devrait être possible de réécrire dans le fichier app.config en utilisant Configuration.Save et selon le http://www.codeproject.com/KB/cs/SystemConfiguration.aspx le code devrait fonctionner. Les bogues sont montrés dans la source ci-dessous et apparaissent lorsque vous essayez de définir la propriété ou de sauvegarder la configuration.Comment puis-je écrire dans mon propre app.config en utilisant un objet fortement typé?

Imports System.Configuration 

Public Class ConfigTest 
    Inherits ConfigurationSection 
<ConfigurationProperty("JunkProperty", IsRequired:=True)> _ 
Public Property JunkProperty() As String 
    Get 
     Return CStr(Me("JunkProperty")) 
    End Get 
    Set(ByVal value As String) 
     ' *** Bug 1, exception ConfigurationErrorsException with message "The configuration is read only." thrown on the following line. 
     Me("JunkProperty") = value 
    End Set 
End Property 

Public Sub Save() 
    Dim ConfigManager As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 

    ' The add/remove is according to http://www.codeproject.com/KB/cs/SystemConfiguration.aspx 
    ConfigManager.Sections.Remove("ConfigTest") 
    ' *** Bug 2, exception InvalidOperationException thrown with message "Cannot add a ConfigurationSection that already belongs to the Configuration." 
    ConfigManager.Sections.Add("ConfigTest", Me) 
    ConfigManager.Save(ConfigurationSaveMode.Full, True) 

End Sub 

Public Shared Sub Main() 
    Dim AppConfig As ConfigTest = TryCast(ConfigurationManager.GetSection("ConfigTest"), ConfigTest) 

    AppConfig.JunkProperty = "Some test data" 
    AppConfig.Save() 

End Sub 

' App.Config should be: 
' <?xml version="1.0" encoding="utf-8" ?> 
    '<configuration> 
    ' <configSections> 
    ' <section name="ConfigTest" type="ConsoleApp.ConfigTest, ConsoleApp" /> 
    ' </configSections> 
    ' <ConfigTest JunkProperty="" /> 
    '</configuration> 

End Class 

Je voudrais le faire de cette façon pour que le premier terme de l'application que je vérifie les propriétés et indiquer à l'utilisateur d'exécuter en tant qu'administrateur si elles doivent être réglées où l'interface utilisateur serait aidez-les avec les paramètres. J'ai déjà couru en tant qu'administrateur sans effet.

Répondre

0

Peut-être que vous ne savez pas # portugais ou c mais ce que vous voulez http://www.linhadecodigo.com.br/Artigo.aspx?id=1613

utilisant BuildProvider de asp.net

+0

Je traduis cet article (http://translate.google.co.uk/translate? u = http% 3A% 2F% 2Fwww.linhadecodigo.com.br% 2FArtigo.aspx% 3Fid% 3D1613 & sl = pt & tl = fr & hl = fr & ie = UTF-8) mais n'a pas pu voir où il mentionne un fichier app.config en lecture/écriture. –

0

Après le chargement d'une configuration, il est en lecture seule par défaut, principalement parce que vous ne l'avez pas overriden la Propriété IsReadOnly. Essayez de le remplacer.

¿Y a-t-il quelque chose qui vous empêche d'utiliser un paramètre?

+0

Non, le remplacement de la propriété IsReadOnly n'a aucun effet. –

0

On dirait que ce n'est pas possible par conception. App.config est normalement protégé car il réside avec l'application dans le répertoire Program Files. Il doit donc être modifié au moment de l'installation par l'installateur.

Dommage vraiment, je voudrais que l'application dispose de paramètres qu'un administrateur peut définir.

1

Votre code n'a pas vraiment de sens. J'ai pris votre exemple de code et l'ai transformé en un exemple simple qui fonctionne. S'il vous plaît noter que ce n'est pas un code de bonnes pratiques, simplement un exemple pour vous aider dans votre voyage d'apprentissage de l'API de configuration.

Public Class ConfigTest 
    Inherits ConfigurationSection 
    <ConfigurationProperty("JunkProperty", IsRequired:=True)> _ 
    Public Property JunkProperty() As String 
     Get 
      Return CStr(Me("JunkProperty")) 
     End Get 
     Set(ByVal value As String) 
      ' *** Bug 1, exception ConfigurationErrorsException with message "The configuration is read only." thrown on the following line. 
      Me("JunkProperty") = value 
     End Set 
    End Property 

    Public Overrides Function IsReadOnly() As Boolean 
     Return False 
    End Function 



    Public Shared Sub Main() 
     Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
     Dim AppConfig As ConfigTest = config.GetSection("ConfigTest") 

     AppConfig.JunkProperty = "Some test data" 
     config.Save() 
    End Sub 
End Class 

Ce code ouvre le fichier de configuration, modifier l'attribut JunkProperty et persister en arrière, il le fichier de configuration de l'exécutable. J'espère que cela vous aidera à démarrer - il semble que vous ayez besoin de lire un peu plus sur l'API de configuration.

J'ai utilisé l'API pour créer des sections de configuration pour des applications d'entreprise à grande échelle, avec plusieurs milliers de lignes de configuration hiérarchique personnalisée (ma config était en lecture seule). L'API de configuration est très puissante une fois que vous l'avez appris. L'une des façons dont j'ai découvert plus de ses capacités était d'utiliser Reflector pour voir comment le framework .NET utilise l'API en interne.

+0

Merci, ça marche.J'étais presque là mais confus par cet article de CodeProject qui a insisté pour que je devais ajouter et enlever la section de config pour réenregistrer. –

+0

En fait, cela ne fonctionne pas. La nouvelle valeur de propriété n'est pas enregistrée dans le fichier de configuration. –

+0

Ryan ça a marché sur ma machine. Vérifiez s'il vous plaît... – RichardOD

0

Désolé si je n'ai pas compris votre cas, mais oui, vous pouvez changer App.config à l'exécution.

En fait, vous devrez changer YourApp.exe.config, car une fois votre application compilée, le contenu App.config est copié dans YourApp.exe.config et votre application ne regarde jamais App.config.

Voici donc ce que je fais (code C# - désolé, je n'ai pas encore appris VB.Net)

public void UpdateAppSettings(string key, string value) 
    { 

     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); 
     foreach (XmlElement item in xmlDoc.DocumentElement) 
     { 
      foreach (XmlNode node in item.ChildNodes) 
      { 

       if (node.Name == key) 
       { 
        node.Attributes[0].Value = value; 
        break; 
       } 
      } 
     } 

     using (StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)) 
     { 
      xmlDoc.Save(sw); 
     } 
Questions connexes