Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在.net中跨不同的程序集版本保留user.config设置?_.net_Settings_Assemblyversions - Fatal编程技术网

如何在.net中跨不同的程序集版本保留user.config设置?

如何在.net中跨不同的程序集版本保留user.config设置?,.net,settings,assemblyversions,.net,Settings,Assemblyversions,基本上,问题在于每次程序集版本更改(即用户安装应用程序的新版本)时,他们的所有设置都会重置为默认设置(或者更准确地说,会在一个文件夹中创建一个新的user.config文件,该文件夹的名称为不同的版本号) 升级版本时如何保持相同的设置,因为似乎不鼓励使用ini文件或注册表 当我们使用Clickonce时,它似乎能够处理这个问题,因此它似乎应该能够完成,但我不确定如何完成。ApplicationSettingsBase有一个从以前版本迁移所有设置的应用程序 为了在发布应用程序的新版本时运行合并,可

基本上,问题在于每次程序集版本更改(即用户安装应用程序的新版本)时,他们的所有设置都会重置为默认设置(或者更准确地说,会在一个文件夹中创建一个新的user.config文件,该文件夹的名称为不同的版本号)

升级版本时如何保持相同的设置,因为似乎不鼓励使用ini文件或注册表


当我们使用Clickonce时,它似乎能够处理这个问题,因此它似乎应该能够完成,但我不确定如何完成。

ApplicationSettingsBase有一个从以前版本迁移所有设置的应用程序

为了在发布应用程序的新版本时运行合并,可以在设置文件中定义默认为true的布尔标志。将其命名为UpgradeRequired或类似名称

然后,在应用程序启动时,检查标志是否已设置,如果已设置,则调用,将标志设置为false并保存配置

if (Settings.Default.UpgradeRequired)
{
    Settings.Default.Upgrade();
    Settings.Default.UpgradeRequired = false;
    Settings.Default.Save();
}

有关升级方法的详细信息,请访问。如果您需要进行一些自定义合并,可能也值得一看。

如果您对user.settings的更改是以编程方式完成的,那么在单独的文件(例如user.customized.settings)中维护(仅)对user.settings的修改的副本如何

您可能仍然希望在user.settings中维护并加载修改后的设置。但是,当您使用较新版本的user.settings安装较新版本的应用程序时,您可以通过将其复制回新的user.settings来询问用户是否希望继续使用修改后的设置。您可以批量导入它们,或者让fancier确认用户希望继续使用哪些设置


编辑:我在“更准确”部分读得太快,内容是关于程序集版本导致新的user.settings安装到新的版本特定目录中。因此,上述想法可能对你没有帮助,但可能会提供一些思考的素材。

我就是这样处理的:

public virtual void LoadSettings(ServiceFileFormBaseSettings settings = null, bool resetSettingsToDefaults = false)
{
    if (settings == null)
            return;

    if (resetSettingsToDefaults)
        settings.Reset();
    else
    {
        settings.Reload();

        if (settings.IsDefault)
            settings.Upgrade();
    }

    this.Size = settings.FormSize;
}

在settings类中,我定义了IsDefault属性:

// SaveSettings always sets this to be FALSE.
// This will have the default value TRUE when first deployed, or immediately after an upgrade.
// When the settings exist, this is false.
//
[UserScopedSettingAttribute()]
[DefaultSettingValueAttribute("true")]
public virtual bool IsDefault
{
    get { return (bool)this["IsDefault"]; }
    set { this["IsDefault"] = value; }
}
在SaveSettings中,我将IsDefault设置为false:

public virtual void SaveSettings(ServiceFileFormBaseSettings settings = null)
{
    if (settings == null) // ignore calls from this base form, if any
        return;

    settings.IsDefault = false;
    settings.FormSize = this.Size;
    settings.Save();
}
我知道已经有一段时间了。。。
在winforms应用程序中,只需在加载它们之前调用
My.Settings.Upgrade()
。这将获得最新的设置,无论是当前版本还是以前的版本。

以下是我的研究,以防其他人在迁移已更改/删除的设置时遇到困难。基本问题是,如果在应用程序的新版本中重命名或删除了设置,则
GetPreviousVersion()
不起作用。因此,您需要在
设置
类中保留该设置,但要向其添加一些属性/工件,这样您就不会无意中在其他代码中使用它,从而使其过时。在VB.NET中,一个过时的设置示例如下(可以很容易地转换为C#):


公共属性OldSettingName()作为字符串
得到
抛出新的NotSupportedException(“此属性已过时”)
结束
设置
抛出新的NotSupportedException(“此属性已过时”)
端集
端属性
确保将此属性添加到具有应用程序设置的同一命名空间/类中。在VB.NET中,该类名为
MySettings
,可在
My
命名空间中使用。您可以使用分部类功能来防止过时设置与当前设置混淆


哈里森发表了一篇关于这个问题的文章,这是对他的充分赞扬。您可以在这里阅读更多有关它的详细信息。

这里介绍了一种不同的解决方案,它将升级逻辑封装到一个抽象类中,设置类可以从中派生

一些建议的解决方案使用DefaultSettingsValue属性指定一个值,该值指示未加载以前的设置的时间。我的偏好是简单地使用一个默认值指示这一点的类型。作为奖励,约会时间?是有用的调试信息

public abstract class UserSettingsBase : ApplicationSettingsBase
{
    public UserSettingsBase() : base()
    {
        // Accessing a property attempts to load the settings for this assembly version
        // If LastSaved has no value (default) an upgrade might be needed
        if (LastSaved == null)
        {
            Upgrade();
        }
    }

    [UserScopedSetting]
    public DateTime? LastSaved
    {
        get { return (DateTime?)this[nameof(LastSaved)]; }
        private set { this[nameof(LastSaved)] = value; }
    }

    public override void Save()
    {
        LastSaved = DateTime.Now;
        base.Save();
    }
}
从UserSettingsBase派生:

public class MySettings : UserSettingsBase
{
    [UserScopedSetting]
    public string SomeSetting
    {
        get { return (string)this[nameof(SomeSetting)]; }
        set { this[nameof(SomeSetting)] = value; }
    }

    public MySettings() : base() { }
}
并使用它:

// Existing settings are loaded and upgraded if needed
MySettings settings = new MySettings();
...
settings.SomeSetting = "SomeValue";
...
settings.Save();

当每个版本只需要升级一次时,下一个简短的解决方案对我有效。它不需要其他设置,如
UpgradeRequired

if(!ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).HasFile)
Settings.Default.Upgrade();

?不,这是指默认情况下不将文件签入版本控制(或我收集到的)这是关于终端用户的(Windows)用户特定设置我需要的问题,谢谢:)我在以下线程中发布了一个可能的解决方案:希望有帮助!我已经在中发布了一个可能的解决方案。希望有帮助!一个小问题,什么是新版本?4个零件号中的任何零件?我使用ClickOnce,那么这是另一种动物吗?需要什么类型的设置<代码>应用程序设置,
用户设置
,或
应用程序设置
?作为用户在Settings.Settings上的设置,一旦第一次将其更改为false,它将不再为true。新版本不会将需要升级的重置为True。@dialex它必须是用户设置。应用程序类型的设置是只读的。新版本号确实会导致设置重置,因为设置存储在特定于版本的路径中。除了
UpgradeRequired
,我会将应用程序的版本存储为设置,而不是/除了
UpgradeRequired
。这允许您执行自定义升级转换(即,将无效值/有效值转换为非-最新版本的默认值/相同值)。您可以使用代码将每个需要转换的适用版本转换为下一个需要转换的最低版本,并将代码菊花链连接在一起,从而:a)降低最新版本转换代码的复杂性,b)允许旧版本的潜在失效
// Existing settings are loaded and upgraded if needed
MySettings settings = new MySettings();
...
settings.SomeSetting = "SomeValue";
...
settings.Save();