User.config ayarlarını .net içindeki farklı derleme sürümlerinde nasıl tutuyorsunuz?


146

Temel olarak sorun, montaj sürümü her değiştiğinde (yani kullanıcı uygulamanın yeni bir sürümünü yüklediğinde) tüm ayarlarının varsayılanları sıfırlamasıdır (veya daha doğru bir şekilde farklı bir sürüme sahip bir klasörde yeni bir user.config dosyası oluşturulur) ad olarak numara)

Sürümleri yükseltirken aynı ayarları nasıl koruyabilirim, çünkü ini dosyalarını veya kayıt defterini kullanmak cesaretini yitirmiş gibi görünüyor?

Clickonce'ı kullandığımızda bunun üstesinden gelebiliyor gibi görünüyordu, bu yüzden yapılabilmesi gerekiyor gibi görünüyor, ama nasıl olduğundan emin değilim.



Hayır, bu, varsayılan olarak bir dosyayı sürüm kontrolüne (veya topladığım) kontrol etmemeye atıfta bulunur. Bu, son bir kullanıcı için (Windows) kullanıcıya özgü ayarlarla ilgilidir
Davy8

Sadece ihtiyacım olan soru, teşekkürler :)
İkili Worrier

Aşağıdaki konuya olası bir çözüm gönderdim: stackoverflow.com/a/47921377/3223783 Umarım yardımcı olur!
dontbyteme

Bu konuya olası bir çözüm gönderdim . Umarım yardımcı olur!
dontbyteme

Yanıtlar:


237

ApplicationSettingsBase, Yükseltme adında , önceki sürümdeki tüm ayarları geçiren bir yönteme sahiptir .

Uygulamanızın yeni bir sürümünü her yayınladığınızda birleştirmeyi çalıştırmak için, ayarlar dosyanızda varsayılanı true olan bir boole bayrağı tanımlayabilirsiniz. UpgradeRequired veya benzeri bir ad verin .

Ardından, uygulama başlangıcında bayrağın ayarlanıp ayarlanmadığını kontrol edersiniz ve ayarlanmışsa Yükseltme yöntemini çağırın , bayrağı false olarak ayarlayın ve yapılandırmanızı kaydedin.

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

MSDN'de Yükseltme yöntemi hakkında daha fazla bilgi edinin . GetPreviousVersion bazı özel birleştirilmesi yapmak gerektiğinde de bir göz değer olabilir.


2
Küçük bir soru, yeni bir sürümü ne oluşturuyor? 4 parça numarasının herhangi bir parçası var mı? ClickOnce kullanıyorum, bu yüzden farklı bir hayvan mı?
Refrakte Paladin

4
UpgradeRequired ne tür bir ayar olmalıdır ? appSettings,, userSettingsveya applicationSettings? Ayarlar'da bir Kullanıcı ayarı olarak, Ayarlar ilk kez yanlış olarak değiştirildikten sonra bir daha asla doğru olmayacaktır. Yeni bir sürüm UpgradeRequired sürümünü True olarak sıfırlamaz .
dialex

4
@dialex Bir Kullanıcı ayarı olmalıdır. Uygulama türünün ayarları salt okunurdur. Yeni sürüm numaraları, ayarlar sürüme özgü bir yolda saklandığından ayarların sıfırlanmasına neden olur.
Leonard Thieu

4
Sanırım kendi sorumu cevapladım. Ayarlar dosyasının önceki bir sürümü varsa, uygulama her başlatıldığında değerlerini en yeni sürüme kopyalar, muhtemelen istediğiniz şey değil!
Hugh Jeffner

1
Bunun sadece varsayılan davranış olmadığını biraz şaşırdım; uygulamanın ayarları başlangıçta boşsa ve önceki bir grup ayarı bulursa, bunları yükler.
SteveCinq

3

Bir süredir olduđunu biliyorum ... Winforms uygulamasýnda, My.Settings.Upgrade()yüklemeden önce ara. Bu, ister geçerli sürüm ister önceki sürüm olsun, en son ayarları alır.


2

Değiştirilmiş / kaldırılmış ayarların taşınmasıyla ilgili başka birisinin zorlanacağı durumlarda araştırmam. Temel sorun, GetPreviousVersion()uygulamanızın yeni sürümünde ayarı yeniden adlandırdıysanız veya kaldırdıysanız çalışmaz. Bu nedenle, ayarı Settingssınıfınızda tutmanız gerekir , ancak yanlışlıkla başka bir yerde kodda kullanmamanız için birkaç nitelik / yapaylık eklemeniz gerekir. Eski bir ayar VB.NET'te şöyle görünecektir (kolayca C # değerine çevrilebilir):

<UserScopedSetting(),
DebuggerNonUserCode(),
DefaultSettingValue(""),
Obsolete("Do not use this property for any purpose. Use YOUR_NEW_SETTING_NAME instead."),
NoSettingsVersionUpgrade()>
Public Property OldSettingName() As String
  Get
    Throw New NotSupportedException("This property is obsolete")
  End Get
  Set
    Throw New NotSupportedException("This property is obsolete")
  End Set
End Property

Bu özelliği, uygulama ayarlarınızla aynı ad alanına / sınıfa eklediğinizden emin olun. VB.NET'te, bu sınıf adlandırılır MySettingsve Myad alanında kullanılabilir. Eski ayarlarınızın geçerli ayarlarınızla karışmasını önlemek için kısmi sınıf işlevini kullanabilirsiniz.

Bu konu hakkında mükemmel bir makale yayınladığı için jsharrison'a tam kredi . Bununla ilgili daha fazla ayrıntıyı orada okuyabilirsiniz.


1

Burada, yükseltme mantığını, ayar sınıflarının türetebileceği soyut bir sınıfa yerleştiren çözümlerin bir varyasyonu.

Önerilen bazı çözümler, önceki ayarların ne zaman yüklenmediğini belirten bir değer belirtmek için DefaultSettingsValue özniteliğini kullanır. Benim tercihim, varsayılan değeri bunu gösteren bir tür kullanmaktır. Bonus olarak, bir DateTime? yardımcı hata ayıklama bilgisidir.

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 öğesinden türet:

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

    public MySettings() : base() { }
}

Ve kullanın:

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

0

User.settings dosyasında yaptığınız değişiklikler programlı olarak yapılırsa, user.settings dosyasında yapılan değişikliklerin (sadece) ayrı bir dosyada (ör. User.customized.settings) bir kopyasının (sadece) korunmasına ne dersiniz?

Muhtemelen yine de değiştirilmiş ayarları user.settings içinde korumak ve yüklemek istiyorsunuz. Ancak bu şekilde, uygulamanızın daha yeni bir sürümünü yeni user.settings ile yüklediğinizde, kullanıcıya değiştirilen ayarlarını yeni user.settings'e kopyalayarak kullanmaya devam etmek isteyip istemediklerini sorabilirsiniz. Onları toptan alabilir veya meraklı olabilir ve kullanıcıdan hangi ayarları kullanmaya devam etmek istediklerini onaylamasını isteyebilirsiniz.

DÜZENLEME: Yeni bir user.settings yeni bir sürüme özgü dizine yüklenmesine neden montaj sürümleri hakkında "daha doğru" bölümünü çok hızlı bir şekilde okudum. Bu nedenle, yukarıdaki fikir muhtemelen size yardımcı olmaz, ancak düşünce için yiyecek sağlayabilir.


0

Ben bu şekilde hallettim:

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;

}

ve ayarlar sınıfında IsDefault özelliğini tanımladım:

// 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'te, IsDefault öğesini false olarak ayarladım:

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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.