2010-04-27 4 views
8

Ich habe ein C# -Programm, das den Standard ApplicationSettingsBase verwendet, um seine Benutzereinstellungen zu speichern. Dies funktionierte unter .NET 3.5 gut. Und die bereitgestellte Upgrade() Methode würde diese Einstellungen "neu laden", sobald eine neue Version meines Programms erstellt wurde.ApplicationSettingsBase.Upgrade() Aktualisieren der Benutzereinstellungen nach dem Neukompilieren mit .NET 4.0

Kürzlich habe ich das Programm mit .NET 4.0 neu kompiliert. Die Versionsnummer meines Programms wurde ebenfalls erhöht. Aber wenn ich diese Version starte, scheint Upgrade() keine früheren Einstellungen zu erkennen und lädt sie nicht neu. Es beginnt leer.

Als Test habe ich noch einmal rekompiliert, zurück zu .NET 3.5. Und diesmal begann die Upgrade() Methode wieder zu arbeiten.

Gibt es eine Möglichkeit, Upgrade() zu funktionieren, wenn Frameworks? Gibt es noch etwas, das mir fehlt?

Antwort

6

Ich hatte genau das gleiche Problem, und wieder habe ich dies mehrmals von .NET 3.5 neu zu .NET 4.0 getestet.

Leider meine Lösung ist in vb.net, aber ich bin sicher, dass Sie eine der vielen Konvertierungsprogramme können dies in C# zu sehen, wie http://www.developerfusion.com/tools/convert/vb-to-csharp/

Es geht in % durch alle Ordner Aufzählen AppData% \ CompanyName finden Sie die letzte user.config Datei in einem Ordnernamen der Version, von der Sie aktualisieren möchten.

Ich fand, dass mein App zu .NET 4.0 unter Visual Studio 2010 neu zu kompilieren einen neuen Ordner des Namen überhaupt schaffen würde % AppData% \ Company \ AppName.exe_Url_blahbahblah obwohl ich geändert hatte absolut keinen andere Einstellungen oder Code!

Alle meine früheren Versionen vor .NET 4.0 behielten den gleichen Ordnernamen und wurden erfolgreich aktualisiert. Das Kopieren der alten user.config-Datei (und des Versionsordnernamens) aus dem alten Ordner in die neue unter .NET 4.0 erstellte Ordnerstruktur (mit dem alten Versionsordnernamen) behebt das Problem - es wird jetzt aktualisiert.

Dieses Beispiel vorausgesetzt, dass Sie eine Benutzereinstellung IUpgraded benannt haben, die Falsch standardmäßig (und später auf True) gesetzt, um zu prüfen, um zu sehen, ob die Einstellungen Anfangs defalt Werte sind oder nicht - Sie jede verwenden andere Variable, die Sie stattdessen erstellt haben. Das Beispiel zeigt ein Upgrade von Version 1.2.0.0 auf etwas später, das Sie ändern können, indem Sie den Wert lastVersion ändern.

Der Code ist an der Spitze der Form Load-Ereignis des neuesten (.NET 4.0) Anwendungsversion platziert werden:

Imports System 
Imports System.IO 

If Not My.Settings.IUpgraded Then 'Upgrade application settings from previous version 
    My.Settings.Upgrade() 
    'The following routine is only relevant upgrading version 1.2.0.0 
    If Not My.Settings.IUpgraded Then 'enumerate AppData folder to find previous versions 
     Dim lastVersion As String = "1.2.0.0" 'version to upgrade settings from 
     Dim config_initial As System.Configuration.Configuration = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal) 
     Dim fpath As String = config_initial.FilePath 
     For x = 1 To 3 'recurse backwards to find root CompanyName folder 
      fpath = fpath.Substring(0, InStrRev(fpath, "\", Len(fpath) - 1)) 
     Next 
     fpath = fpath.Substring(0, Len(fpath) - 1) 'remove trailing backslash 
     Dim latestConfig As FileInfo 'If not set then no previous info found 
     Dim di As DirectoryInfo = New DirectoryInfo(fpath) 
     If di.Exists Then 
      For Each diSubDir As DirectoryInfo In di.GetDirectories(lastVersion, SearchOption.AllDirectories) 
       If InStr(diSubDir.FullName, ".vshost") = 0 Then 'don't find VS runtime copies 
        Dim files() As FileInfo = diSubDir.GetFiles("user.config", SearchOption.TopDirectoryOnly) 
        For Each File As FileInfo In files 
         Try 
          If File.LastWriteTime > latestConfig.LastWriteTime Then 
           latestConfig = File 
          End If 
         Catch 
          latestConfig = File 
         End Try 
        Next 
       End If 
      Next 
     End If 
     Try 
      If latestConfig.Exists Then 
       Dim newPath As String = config_initial.FilePath 
       newPath = newPath.Substring(0, InStrRev(newPath, "\", Len(newPath) - 1)) 
       newPath = newPath.Substring(0, InStrRev(newPath, "\", Len(newPath) - 1)) 
       newPath &= lastVersion 
       If Directory.Exists(newPath) = False Then 
        Directory.CreateDirectory(newPath) 
       End If 
       latestConfig.CopyTo(newPath & "\user.config") 
       My.Settings.Upgrade() 'Try upgrading again now old user.config exists in correct place 
      End If 
     Catch : End Try 
    End If 
    My.Settings.IUpgraded = True 'Always set this to avoid potential upgrade loop 
    My.Settings.Save() 
End If 
+0

+1 ich diese Lösung implementiert haben, weil wir von .NET 2.0 auf .NET 4.0 aktualisiert haben. Ein kleiner Fehler - 'di.Exists' erkennt den Ordner nicht richtig, wenn er mit einem' .' endet, also muss er zuerst mit etwas wie [dieser Lösung] normalisiert werden (http://stackoverflow.com/questions/ 2281531/how-can-i-Vergleich-Verzeichnis-Pfade-in-c). – mellamokb

+0

Danke, dass du mir hilfst, dass dies nicht der Fehler meines Codes ist.Sie haben mir wahrscheinlich Stunden der Überprüfung und Überprüfung (über die Stunden, die ich bereits verbracht habe) erspart. – Grault

4

Hier ist der Code ist.

public static class SettingsUpdate 
{ 
    public static void Update() 
    { 
     try 
     { 
      var a = Assembly.GetExecutingAssembly(); 

      string appVersionString = a.GetName().Version.ToString(); 

      if(UserSettings.Default.internalApplicationVersion != appVersionString) 
      { 
       var currentConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
       var exeName = "MyApplication.exe"; 
       var companyFolder = new DirectoryInfo(currentConfig.FilePath).Parent.Parent.Parent; 

       FileInfo latestConfig = null; 

       foreach(var diSubDir in companyFolder.GetDirectories("*" + exeName + "*", SearchOption.AllDirectories)) 
       { 
        foreach(var file in diSubDir.GetFiles("user.config", SearchOption.AllDirectories)) 
        { 
         if(latestConfig == null || file.LastWriteTime > latestConfig.LastWriteTime) 
         { 
          latestConfig = file; 
         } 
        } 
       } 

       if(latestConfig != null) 
       { 
        var lastestConfigDirectoryName = Path.GetFileName(Path.GetDirectoryName(latestConfig.FullName)); 

        var latestVersion = new Version(lastestConfigDirectoryName); 
        var lastFramework35Version = new Version("4.0.4605.25401"); 

        if(latestVersion <= lastFramework35Version) 
        { 
         var destinationFile = Path.GetDirectoryName(Path.GetDirectoryName(currentConfig.FilePath)); 
         destinationFile = Path.Combine(destinationFile, lastestConfigDirectoryName); 

         if(!Directory.Exists(destinationFile)) 
         { 
          Directory.CreateDirectory(destinationFile); 
         } 

         destinationFile = Path.Combine(destinationFile, latestConfig.Name); 

         File.Copy(latestConfig.FullName, destinationFile); 
        } 
       } 

       Properties.Settings.Default.Upgrade(); 
       UserSettings.Default.Upgrade(); 
       UserSettings.Default.internalApplicationVersion = appVersionString; 
       UserSettings.Default.Save(); 
      } 
     } 
     catch(Exception ex) 
     { 
      LogManager.WriteExceptionReport(ex); 
     } 
    } 
} 

Kann dies wird Ihnen helfen :)

Verwandte Themen