आप .net में विभिन्न विधानसभा संस्करणों में user.config सेटिंग्स कैसे रखते हैं?


146

मूल रूप से समस्या यह है कि हर बार असेंबली संस्करण में परिवर्तन होता है (यानी उपयोगकर्ता एप्लिकेशन का एक नया संस्करण स्थापित करता है) उनकी सभी सेटिंग्स डिफ़ॉल्ट को रीसेट कर देती हैं (या अधिक सटीक रूप से एक नया user.config फ़ाइल एक अलग संस्करण के साथ फ़ोल्डर में बनाई जाती है नाम के रूप में संख्या)

संस्करणों को अपग्रेड करते समय, इनआई फ़ाइलों या रजिस्ट्री का उपयोग करने से हतोत्साहित होने के बाद मैं उसी सेटिंग्स को कैसे रख सकता हूं?

जब हमने Clickonce का उपयोग किया था तो ऐसा लग रहा था कि यह इसे संभाल सकता है, इसलिए ऐसा लगता है कि इसे किया जाना चाहिए, लेकिन मुझे यकीन नहीं है कि कैसे।



नहीं, यह डिफ़ॉल्ट रूप से एक फ़ाइल को संस्करण नियंत्रण में फ़ाइल की जांच नहीं करने के लिए (या इसलिए मैं इकट्ठा हुआ) का संदर्भ है। यह एक अंतिम उपयोगकर्ता के लिए (विंडोज) उपयोगकर्ता विशिष्ट सेटिंग्स के संबंध में है
डेवी 8

बस मुझे जो प्रश्न चाहिए, धन्यवाद :)
बाइनरी वॉरियर जूल

मैंने निम्नलिखित थ्रेड में एक संभावित समाधान पोस्ट किया है: stackoverflow.com/a/47921377/3223783 आशा है कि मदद करता है!
नॉटबीटेममे

मैंने इस धागे में एक संभावित समाधान पोस्ट किया है । उम्मीद है की वो मदद करदे!
नॉटबीटेममे

जवाबों:


236

ApplicationSettingsBase में अपग्रेड नामक एक विधि है जो पिछले संस्करण से सभी सेटिंग्स को स्थानांतरित करती है।

मर्ज को चलाने के लिए जब भी आप अपने एप्लिकेशन का नया संस्करण प्रकाशित करते हैं तो आप अपनी सेटिंग फ़ाइल में एक बूलियन ध्वज को परिभाषित कर सकते हैं जो सत्य के लिए चूक है। इसे नाम दें नवीनीकरण या कुछ इसी तरह।

फिर, आवेदन शुरू होने पर आप यह देखने के लिए जांच करें कि क्या झंडा सेट है और यदि यह है, तो अपग्रेड विधि को कॉल करें , ध्वज को झूठे पर सेट करें और अपने कॉन्फ़िगरेशन को सहेजें।

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

MSDN पर अपग्रेड पद्धति के बारे में और पढ़ें । GetPreviousVersion भी एक नज़र लायक अगर आप कुछ कस्टम विलय करने की जरूरत हो सकती है।


2
एक छोटा सा सवाल, एक नया संस्करण क्या है? 4 भाग संख्या का कोई भाग? मैं ClickOnce का उपयोग करता हूं ताकि एक अलग जानवर हो?
अपवर्तित

4
किस प्रकार की सेटिंग अपग्रेडेड होनी चाहिए? appSettings, userSettingsया applicationSettings? Settings.Settings पर एक उपयोगकर्ता सेटिंग के रूप में, एक बार पहली बार इसे गलत में बदल देने के बाद यह फिर से सच नहीं होगा। नया संस्करण उस अपग्रेडेड ट्रू बैक को True पर रीसेट नहीं करेगा ।
डायलेक्स

4
@dialex यह एक उपयोगकर्ता सेटिंग होना चाहिए। प्रकार अनुप्रयोग की सेटिंग केवल-पढ़ने के लिए होती है। नई संस्करण संख्याएं सेटिंग को रीसेट करने का कारण बनती हैं क्योंकि सेटिंग्स संस्करण-विशिष्ट पथ में संग्रहीत होती हैं।
लियोनार्ड थिउ

4
मुझे लगता है कि मैंने अपने सवाल का जवाब दिया। यदि सेटिंग फ़ाइल का पिछला संस्करण मौजूद है, तो यह हर बार ऐप के शुरू होने पर अपने मूल्यों को नवीनतम संस्करण में कॉपी करेगा, शायद आप जो चाहते हैं वह नहीं!
ह्यूग जेफनर

1
मैं थोड़ा हैरान हूं कि यह सिर्फ डिफ़ॉल्ट व्यवहार नहीं है; यदि एप्लिकेशन की सेटिंग प्रारंभ में रिक्त हैं और यह सेटिंग्स का एक पिछला गुच्छा पाता है, तो यह उन्हें लोड करता है।
स्टीविन्क

3

मुझे पता है कि थोड़ी देर हो गई है ... एक winforms ऐप में, बस My.Settings.Upgrade()उन्हें लोड करने से पहले कॉल करें। यह नवीनतम सेटिंग्स प्राप्त करेगा, चाहे वर्तमान संस्करण या पिछले संस्करण।


2

यहाँ मेरे शोध के मामले में किसी और को प्रवासन सेटिंग्स के साथ एक कठिन समय है जिसे बदल दिया गया है / हटा दिया गया है। मूल समस्या यह है कि GetPreviousVersion()यदि आपने अपने एप्लिकेशन के नए संस्करण में सेटिंग का नाम बदला है या हटा दिया है तो यह काम नहीं करता है। इसलिए आपको सेटिंग को अपनी Settingsकक्षा में रखने की आवश्यकता है , लेकिन इसमें कुछ विशेषताएँ / कलाकृतियाँ जोड़ें ताकि आप अनजाने में इसे कोड में कहीं और उपयोग न करें, जिससे यह अप्रचलित हो जाए। VB.NET में एक नमूना अप्रचलित सेटिंग इस तरह दिखाई देगी (आसानी से C # में अनुवादित की जा सकती है):

<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

सुनिश्चित करें कि आप इस संपत्ति को उसी नामस्थान / वर्ग में जोड़ते हैं जिसमें आपकी एप्लिकेशन सेटिंग है। VB.NET में, इस वर्ग का नाम है MySettingsऔर इसमें उपलब्ध हैMy नामस्थान । आप अपनी अप्रचलित सेटिंग्स को अपनी वर्तमान सेटिंग्स के साथ मिलाने से रोकने के लिए आंशिक वर्ग कार्यक्षमता का उपयोग कर सकते हैं।

इस मुद्दे के बारे में एक उत्कृष्ट लेख पोस्ट करने के लिए jsharrison का पूरा श्रेय । आप इसके बारे में अधिक जानकारी वहां पढ़ सकते हैं।


1

यहां प्रस्तुत समाधानों पर एक भिन्नता है जो उन्नयन तर्क को एक अमूर्त वर्ग में समाहित करता है जो सेटिंग्स वर्ग से प्राप्त कर सकते हैं।

कुछ प्रस्तावित समाधान एक मान निर्दिष्ट करने के लिए 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();

0

यदि user.settings में आपके परिवर्तन प्रोग्रामेटिक रूप से किए जाते हैं, तो कैसे (सिर्फ) एक प्रति को अलग फ़ाइल में user.settings, जैसे user.customized.settings के संशोधन को बनाए रखने के बारे में?

आप शायद अभी भी user.settings में संशोधित सेटिंग्स को बनाए रखना और लोड करना चाहते हैं। लेकिन इस तरह से जब आप अपने एप्लिकेशन के नए संस्करण को user.settings के नए संस्करण के साथ स्थापित करते हैं, तो आप उपयोगकर्ता से पूछ सकते हैं कि क्या वे नए उपयोगकर्ता में वापस कॉपी करके अपनी संशोधित सेटिंग्स का उपयोग करना जारी रखना चाहते हैं। आप उन्हें थोक आयात कर सकते हैं, या प्रशंसक मिल सकते हैं और उपयोगकर्ता से यह पुष्टि करने के लिए कह सकते हैं कि वे किन सेटिंग्स का उपयोग करना जारी रखना चाहते हैं।

संपादित करें: मैं विधानसभा संस्करणों के बारे में "अधिक सटीक" भाग पर बहुत जल्दी पढ़ता हूं, जिससे एक नया उपयोगकर्ता-सेटिटिंग्स एक नए संस्करण-विशिष्ट निर्देशिका में स्थापित हो सकता है। इस प्रकार, ऊपर दिया गया विचार शायद आपकी मदद नहीं करता है, लेकिन विचार के लिए कुछ भोजन प्रदान कर सकता है।


0

इस तरह मैंने इसे संभाला:

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;

}

और सेटिंग वर्ग में, मैंने 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 को झूठा सेट किया:

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();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.