c# .net .net-4.0

c# - ApplicationSettingsBase.Upgrade() No actualiza la configuración del usuario después de recompilar con.NET 4.0



.net-4.0 (2)

Aquí está el código.

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 ); } } }

Que esto te ayude :)

Tengo un programa C # que está utilizando la ApplicationSettingsBase estándar para guardar su configuración de usuario. Esto funcionaba bien en .NET 3.5. Y el método Upgrade() provisto se "recargará" correctamente cuando se haya creado una nueva versión de mi programa.

Recientemente, recompuse el programa con .NET 4.0. El número de versión de mi programa también aumentó. Pero, cuando ejecuto esta versión, Upgrade() no parece detectar ninguna configuración de versión anterior, y no los "recarga". Comienza en blanco.

Como prueba, recompuse una vez más, volviendo a .NET 3.5. Y esta vez, el método Upgrade() comenzó a funcionar nuevamente.

¿Hay alguna manera de permitir que Upgrade() funcione cuando se cambian los frameworks? ¿Hay algo más que me estoy perdiendo?


Tenía exactamente el mismo problema, y ​​nuevamente probé esto varias veces desde .NET 3.5, recompilado a .NET 4.0.

Lamentablemente, mi solución está en vb.net, pero estoy seguro de que puede usar uno de los muchos programas de conversión para ver esto en c # como http://www.developerfusion.com/tools/convert/vb-to-csharp /

Implica enumerar todas las carpetas en % AppData% / CompanyName para buscar el último archivo user.config en el nombre de la carpeta de la versión desde la que desea actualizar.

Descubrí que la recompilación de mi aplicación a .NET 4.0 en Visual Studio 2010 crearía una nueva carpeta con el nombre % AppData% / CompanyName / AppName.exe_Url_blahbahblah , ¡aunque no había cambiado absolutamente ninguna otra configuración o código!

Todas mis versiones anteriores a .NET 4.0 conservaron el mismo nombre de carpeta y se actualizaron satisfactoriamente. Copiar el antiguo archivo user.config (y el nombre de la carpeta de la versión) de la carpeta anterior en la nueva estructura de carpetas creada en .NET 4.0 (con el nombre de la carpeta de la versión anterior) soluciona el problema: ahora se actualizará.

Este ejemplo asume que tiene una configuración de usuario llamada IUpgraded que está establecida en False de forma predeterminada (y luego configurada en True) para verificar si las configuraciones son valores defalt iniciales o no; puede usar cualquier otra variable que haya creado. El ejemplo muestra la actualización de la versión 1.2.0.0 a algo posterior que puede cambiar cambiando el valor de lastVersion .

El código debe colocarse en la parte superior del formulario Cargar evento de su última versión de la aplicación (.NET 4.0):

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