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