क्या मैं एप्लिकेशन अपग्रेड पर सेटिंग्स खोने से बचने के लिए .NET उपयोगकर्ता सेटिंग्स के स्थान को नियंत्रित कर सकता हूं?


104

मैं user.configफ़ाइल के स्थान को अनुकूलित करने का प्रयास कर रहा हूं । वर्तमान में यह एक हैश और संस्करण संख्या के साथ संग्रहीत है

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

मैं आवेदन के संस्करण के लिए अज्ञेय होना चाहता हूं

%AppData%\[CompanyName]\[ProductName]\

क्या ऐसा किया जा सकता है और कैसे? निहितार्थ क्या हैं? क्या उन्नयन के बाद उपयोगकर्ता पिछले संस्करण से अपनी सेटिंग्स खो देगा?


जबकि उज़बोन का जवाब फ़ाइल स्थान के संबंध में जानकारीपूर्ण है, मेरा मानना ​​है कि अपान के संबंध में इयान की स्थिति अधिक सही है।
एंथनी Mastrean

4
@AnthonyMastrean मैं व्यक्तिगत रूप से सोचता हूं कि किसी भी महत्वपूर्ण सेटिंग्स को एप्लिकेशनसेटिंग के बुनियादी ढांचे पर भरोसा नहीं करना चाहिए, बशर्ते मेरा Microsoft। Muxa को बस सेटिंग्स को स्टोर करना चाहिए %AppData%\[CompanyName]/[ProductName]जहां हम भरोसा कर सकते हैं कि वह बनी रहेगी।
इयान बॉयड

2
कोई शक नहीं, अंतर्निहित एप्लिकेशन और उपयोगकर्ता सेटिंग्स के साथ मेरा निरंतर अनुभव भयानक रहा है। मैं appdata या प्रोग्रामडाटा में json फ़ाइलों की सलाह देते हैं।
एंथनी मास्टरीन

आप अपनी सेटिंग्स को एक रजिस्ट्री में भी संग्रहीत कर सकते हैं। वैकल्पिक सेटिंग्स वर्ग कार्यान्वयन के लिए stackoverflow.com/a/12127888/1273550 देखें ।
रवि पटेल

जवाबों:


39

पहले प्रश्न का उत्तर देने के लिए, आप तकनीकी रूप से फ़ाइल को जहाँ चाहें रख सकते हैं, हालाँकि आपको इसे स्वयं कोड करना होगा, क्योंकि फ़ाइल जिस स्थान पर जाती है, वह आपके दो उदाहरणों में से पहला है। ( यह कैसे करना है खुद से लिंक )

दूसरे प्रश्न के रूप में, यह इस बात पर निर्भर करता है कि आप आवेदन को कैसे लागू करते हैं। यदि आप .msi के माध्यम से तैनाती करते हैं, तो सेटअप प्रोजेक्ट के गुणों में दो हैश (कि msi से बनाया गया है), 'उन्नयन कोड' और 'उत्पाद कोड' हैं। ये निर्धारित करते हैं कि एमएसआई कैसे स्थापित किया जा सकता है, और यदि यह उसी एप्लिकेशन के किसी अन्य संस्करण के बगल में अपग्रेड, ओवरराइट करता है, या इंस्टॉल करता है।

उदाहरण के लिए, यदि आपके पास अपने सॉफ़्टवेयर के दो संस्करण हैं और उनके पास अलग-अलग 'अपग्रेड' कोड हैं, तो खिड़कियों के लिए वे सॉफ्टवेयर के पूरी तरह से अलग-अलग टुकड़े हैं, चाहे नाम कुछ भी हो। हालाँकि यदि 'अपग्रेड' कोड समान है, लेकिन 'उत्पाद' कोड अलग है, तो जब आप 2nd msi को स्थापित करने का प्रयास करेंगे तो यह आपसे पूछेगा कि क्या आप अपग्रेड करना चाहते हैं, उस समय मानों को कॉपी करने के लिए कौन सा समय चाहिए एक नए विन्यास में पुराना विन्यास। यदि दोनों मान समान हैं, और संस्करण संख्या परिवर्तित नहीं हुई है, तो नया कॉन्फ़िगरेशन पुराने कॉन्फ़िगरेशन के समान स्थान पर होगा, और इसे कुछ भी करने की आवश्यकता नहीं होगी। MSDN प्रलेखन

ClickOnce थोड़ा अलग है, क्योंकि इसका ClickOnce संस्करण # और URL पथ से अधिक आधारित है, हालाँकि मैंने पाया है कि जब तक आप उसी स्थान पर 'प्रकाशित' करते रहेंगे, तब तक एप्लिकेशन का नया संस्करण उपयोग करना जारी रखेगा मौजूदा विन्यास। ( कैसे ClickOnce अद्यतन संभालती है के लिए लिंक )

मुझे यह भी पता है कि कस्टम इंस्टॉल स्क्रिप्ट्स का उपयोग करके msi की स्थापना के दौरान मैन्युअल रूप से मर्ज करने का एक तरीका है, लेकिन मुझे यह करने के लिए सटीक चरण याद नहीं हैं ... ( वेब के साथ यह करने के लिए इस लिंक को देखें । config)


क्या अपग्रेड कोड वह नहीं है जिसे निरंतर रहना चाहिए, और उत्पाद कोड वह है जो रिलीज़ के बीच बदलना चाहिए? blogs.msdn.com/b/pusu/archive/2009/06/10/understanding-msi.aspx
estanford

रवींद्र! आप सही हैं, मुझे विश्वास नहीं हो रहा है कि मुझे एक पीछे की ओर मिला (और इसे पकड़ने में 2 साल लगे)। यह मेरे अतीत में एक बिंदु पर थोड़ी देर के लिए रोबो-हस्ताक्षर करने जैसा था :(
uzbones

क्या इसका मतलब है, कि केवल इंस्टॉल करने वाले उपयोगकर्ता को उसकी सेटिंग अपग्रेड की जाती है?
मीका विडेनमैन

79

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

Properties.Settings.Value.Upgrade();

से क्लाइंट सेटिंग पूछे जाने वाले प्रश्न ब्लॉग पोस्ट: ( संग्रह )

प्रश्न: user.config पथ में एक संस्करण संख्या क्यों है? यदि मैं अपने एप्लिकेशन का नया संस्करण तैनात करता हूं, तो क्या उपयोगकर्ता पिछले संस्करण द्वारा सहेजी गई सभी सेटिंग्स नहीं खोएगा?

एक: उपयोगकर्ता के कारण मार्ग के कुछ कारण हैं ।config पथ संस्करण संवेदनशील है।

(1) किसी एप्लिकेशन के विभिन्न संस्करणों के साइड-बाय-साइड परिनियोजन का समर्थन करने के लिए (आप उदाहरण के लिए, Clickonce के साथ ऐसा कर सकते हैं)। एप्लिकेशन के विभिन्न संस्करण के लिए अलग-अलग सेटिंग्स को सहेजना संभव है।

(2) जब आप किसी एप्लिकेशन को अपग्रेड करते हैं, तो सेटिंग वर्ग को बदल दिया गया हो सकता है और जो सहेजा गया है उसके साथ संगत नहीं हो सकता है, जिससे समस्याएं हो सकती हैं।

हालांकि, हमने एप्लिकेशन के पिछले संस्करण से नवीनतम में सेटिंग्स को अपग्रेड करना आसान बना दिया है। बस ApplicationSettingsBase.Upgrad () को कॉल करें और यह पिछले संस्करण से सेटिंग्स को पुनः प्राप्त करेगा जो कक्षा के वर्तमान संस्करण से मेल खाते हैं और उन्हें वर्तमान संस्करण के user.config फ़ाइल में संग्रहीत करते हैं। आपके पास इस व्यवहार को आपके सेटिंग वर्ग या आपके प्रदाता कार्यान्वयन में भी ओवरराइड करने का विकल्प है।

प्रश्न: ठीक है, लेकिन मुझे कैसे पता चलेगा कि कब अपग्रेड करना है?

एक: अच्छा सवाल है। Clickonce में, जब आप अपने एप्लिकेशन का एक नया संस्करण इंस्टॉल करते हैं, तो ApplicationSettingsBase इसका पता लगाएगा और स्वचालित रूप से पॉइंट सेटिंग्स पर आपके लिए सेटिंग्स अपग्रेड हो जाती हैं। गैर-क्लिकऑन मामलों में, कोई स्वचालित अपग्रेड नहीं है - आपको खुद को अपग्रेड करना होगा। अपग्रेड कॉल करने के लिए यह निर्धारित करने के लिए यहां एक विचार है:

कॉलअपग्रेड नामक एक बूलियन सेटिंग रखें और इसे सही मान दें। जब आपका ऐप शुरू होता है, तो आप कुछ ऐसा कर सकते हैं:

if (Properties.Settings.Value.CallUpgrade)
{
   Properties.Settings.Value.Upgrade();
   Properties.Settings.Value.CallUpgrade = false;    
}

यह सुनिश्चित करेगा कि अपग्रेड () एक नया संस्करण तैनात होने के बाद केवल पहली बार आवेदन चलाता है।

मैं एक दूसरे के लिए विश्वास नहीं करता हूं कि यह वास्तव में काम कर सकता है - कोई तरीका नहीं है कि Microsoft यह क्षमता प्रदान करेगा, लेकिन विधि बस एक ही है।


3
यह पूरी तरह से काम करता है! मैंने सिर्फ साधारण if(CallUpgrade) { Upgrade(); }कथन का उपयोग किया ।
एंथनी Mastrean

@ इयान बॉयड: मुझे यह विचार पसंद है और मैं एक संभावित समाधान के बारे में पूरी तरह से चिंतित हूं लेकिन मैं एक चीज के बारे में उलझन में हूं। मैं एक नहीं है Properties.Settings.Value मेरे पास हैProperties.Settings हिस्सा है, लेकिन मैं कुछ याद आ रही है या कि आप के लिए विशिष्ट है?
पल्विन सेप

8
यह अच्छी तरह से काम करता है, लेकिन मैं पाठकों को याद दिलाता हूं कि कॉन्फ़िगरेशन का पथ लेकिन संस्करण संख्या को छोड़कर समान होना चाहिए। यानी देखें @ अमृत का जवाब उदाहरण के लिए, यदि ऐप का नया संस्करण पिछले संस्करण की तुलना में किसी भिन्न फ़ाइल पथ से लॉन्च किया गया है, तो Upgradeकाम नहीं करता है।
स्टीफन स्वेनसेन

1
@RefractedPaladin यह हैProperties.Settings.Default.Upgrade()
स्टीफन

5
Properties.Settings.Default.Save();इसे झूठा करने के लिए बदलने के बाद जोड़ना न भूलें :-)
जेफ

32

User.config फ़ाइल पर संग्रहीत है

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

<c:\Documents and Settings>उपयोगकर्ता डेटा निर्देशिका या तो गैर-रोमिंग (ऊपर स्थानीय सेटिंग) या रोमिंग है।
<username>उपयोगकर्ता नाम है।
<companyname>यदि उपलब्ध हो तो CompanyNameAttribute मान, है। अन्यथा, इस तत्व को अनदेखा करें।
<appdomainname>AppDomain.CurrentDomain.FriendlyName है। यह आमतौर पर .exe नाम के लिए डिफ़ॉल्ट है।
<eid>हैश को उपलब्ध साक्ष्यों के आधार पर URL, StrongName या Path है।
<hash>वर्तमान के वरीयता क्रम में CurrentDomain से एकत्रित साक्ष्य का SHA1 हैश है:
1. StrongName
2. URL:
यदि इनमें से कोई भी उपलब्ध नहीं है, तो .exe पथ का उपयोग करें।
<version>विधानसभा है।

पूरा विवरण यहाँ http://msdn.microsoft.com/en-us/library/ms379611.aspx है


4

(मैं इसे @ अमृत के उत्तर के लिए एक टिप्पणी के रूप में जोड़ूंगा, लेकिन मेरे पास अभी तक ऐसा करने के लिए पर्याप्त प्रतिनिधि नहीं है।)

MSDN लेख की जानकारी बहुत स्पष्ट है और अभी भी लागू होती है। हालाँकि यह उल्लेख करने में विफल रहता है कि SHA1 हैश को अधिक विशिष्ट आधार 16 के बजाय बेस 32 एनकोडेड लिखा गया है।

मेरा मानना ​​है कि उपयोग किए जा रहे एल्गोरिथ्म को इसमें लागू किया गया है ToBase32StringSuitableForDirName, जिसे यहां Microsoft संदर्भ स्रोत में पाया जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.