为了完整起见。。
我最终被这个黑客攻击了。很难看,但很管用。
主要方法
//只有在没有设置的情况下才进行升级检查
{
升级appsettings();
}
在同一类中使用这些方法。
private static void UpgradeAppSettings()
{
try
{
List<string> paths = new List<string>();
paths.Add(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
paths.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
foreach (string path in paths)
{
string companypath = System.IO.Directory.GetDirectories(path, "COMPANYNAME").FirstOrDefault();
if (companypath != null)
{
string appfolder = System.IO.Directory.GetDirectories(companypath, "OldName.exe_*").FirstOrDefault();
if (appfolder != null)
{
var version =
System.IO.Directory.GetDirectories(appfolder)
.Select(
d => new
{
Path = d,
Version = CreateVersion(new System.IO.DirectoryInfo(d).Name),
ConfigFile = System.IO.Directory.GetFiles(d, "user.config").FirstOrDefault()
}
)
.Where(v => v.Version != null && v.ConfigFile != null)
.OrderByDescending(v => v.Version)
.FirstOrDefault();
if (version != null)
{
string text = System.IO.File.ReadAllText(version.ConfigFile);
text = text.Replace(
"http://schemas.microsoft.com/clr/nsassem/OldName/OldName",
"http://schemas.microsoft.com/clr/nsassem/OldName/NewName");
var doc = XDocument.Parse(text);
var settings = doc.Descendants("setting");
ApplySetting(settings, "Categories", s => Properties.Settings.Default.Categories = s);
ApplySetting(settings, "ActiveCategoryFilter", s => Properties.Settings.Default.ActiveCategoryFilter = s);
ApplySetting(settings, "ActiveCategoryFilterDisplayName", s => Properties.Settings.Default.ActiveCategoryFilterDisplayName = s);
ApplySetting(settings, "ListViewLayout", s => Properties.Settings.Default.ListViewLayout = s);
ApplySetting(settings, "SplitterSizes", s => Properties.Settings.Default.SplitterSizes = s);
ApplySetting(settings, "EditorSizes", s => Properties.Settings.Default.EditorSizes = s);
ApplySetting(settings, "WindowStates", s => Properties.Settings.Default.WindowStates = s);
ApplySetting(settings, "WindowStates", s => Properties.Settings.Default.WindowStates = s);
break;
}
}
}
}
}
catch { }
}
private static void ApplySetting(IEnumerable<XElement> settings, string name, Action<string> action)
{
var cat = settings.FirstOrDefault(s => s.Attribute("name") != null && s.Attribute("name").Value == name);
if (cat != null)
{
action(cat.Value);
}
}