2013-11-21 4 views
10

अगर मैं उदाहरण के लिए मेरी संकलित आवेदन myapp.exeapp.exe करने से तो जब मैं नाम दिया निष्पादन एक नया उपयोगकर्ता सेटिंग्स फ़ोल्डर इस मार्ग में उत्पन्न होता है चलाने के नाम बदलें।एक कस्टम पथ परिभाषित करें जहां user.config फ़ाइल सहेजी जानी चाहिए?</p> <pre><code>C:Users{User}AppDataLocal{CompanyName}{ExecutableName}_Url_{SystemGUID or something strange} </code></pre> <p>तो मैं सभी सहेजी गई सेटिंग ढीला:

तो मैं कैसे इस समस्या को एक VBNETWinForms मेरी अपनी user.config फ़ाइल, या किसी अन्य समाधान applicationsettings बुनियादी सुविधाओं का उपयोग कर स्टोर करने के लिए स्थान में परिभाषित करने का समाधान कर सकता है?

पी एस (रजिस्ट्री या अन्य चीजों पर सेटिंग्स बचत नहीं): मैं इस अतः जिस पद थोड़ा अलग सवाल यह है कि पढ़ा है लेकिन वैसे भी मैं समझ नहीं आया कि माना समाधान Can I control the location of .NET user settings to avoid losing settings on application upgrade?

+3

उस लिंक में इयान बॉयड की टिप्पणी का ध्यान रखें। फिर ध्यान दें कि बहुत कम गंभीर ऐप्स (मेरे सिस्टम पर कोई भी नहीं) डिफ़ॉल्ट/My.Settings का उपयोग करते हैं। डिफ़ॉल्ट बहुत आसानी प्रदान करता है, लेकिन न्यूनतम लचीलापन और कोई सुरक्षा नहीं है। स्टोरेज के लिए CompName \ Product location का उपयोग करने से आप जो कुछ भी चाहते हैं उसे कर सकते हैं (EXE नाम बदलें, TrialVer सेटिंग्स आयात करें, या एन्क्रिप्ट सेटिंग्स यदि किसी समाप्ति तिथि की तरह कुछ हो)। एक कस्टम सेटिंग्स क्लास कई असाइनमेंट के बिना सभी डेटा को सहेजने या लोड करने के लिए बाइनरी सीरियलाइज़र का उपयोग भी कर सकता है ('me.thisval = My.Settings.ThisVal')। जानकारी के लिए – Plutonix

उत्तर

6

अधिक जानकारी और लिंक से एक tidbit जो आपके प्रश्न के उत्तर:

"systemGUID या कुछ और" आप संदर्भ वास्तव में 2 बातें (संदर्भ MSDN My.Settings) के हैश है:

<eid> is the URL, StrongName, or Path, based on the evidence available to hash. 
<hash> is a SHA1 hash of evidence gathered from the CurrentDomain, 
    in the following order of preference: 
    - StrongName 
    - URL If neither of these is available, use the .exe path. 

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

नई रिलीज/संस्करण सेटिंग्स के लिए प्रत्येक संस्करण के लिए उस फ़ोल्डर के नीचे एक उप फ़ोल्डर पेड़ बना देगा। लिंक में उल्लिखित Settings के लिए Upgrade विधि (स्पष्ट रूप से) पिछले संस्करण से सेटिंग्स आयात करने की सुविधा प्रदान करता है। EXE नाम में एक परिवर्तन AppDomain.FriendlyName (तृतीय तत्व) को बदलने के लिए कारण होगा।


पृथक संग्रहण एक और विकल्प है, और यह उतना कठिन नहीं है जितना पहले दिखता है, लेकिन समान व्यवहार होता है। आईएसओ के साथ, आप एक फ़ोल्डर निर्दिष्ट नहीं करते हैं क्योंकि यह सिर्फ Users\<User>\Isolated Storage\zhxytg\dhfyres\ जैसे अस्पष्ट स्थान में से एक बनाता है। यदि आप ClickOnce का उपयोग करते हैं, तो स्थान ऐप के सभी संस्करणों के लिए भी वही रहता है, भले ही आप इसका नाम बदल दें (इसलिए, यह एक और व्यवहार्य समाधान है)।

मुझे लगता है कि आपको आवेदन स्तर के साक्ष्य प्राप्त करने के लिए क्लिकऑन (स्ट्रॉन्गनाम एक प्रतिस्थापन के रूप में नहीं आया है) का उपयोग करना होगा। आईएसओ के साथ, उच्चतम सुरक्षा के तहत भी, एक गैर व्यवस्थापक उपयोगकर्ता कम से कम W7 के साथ ProgramData\AllUsers (लाइसेंस के मामले में हो सकता है, या ऐप सूट के लिए साझा सेटिंग्स) में साझा फ़ाइलों को पढ़/लिख सकता है। ऐप के हैश ने इसे उस पथ पर लिखने की अनुमति दी है, इसलिए यह कुछ चीजें कर सकता है जो हम आम तौर पर नहीं कर सकते हैं।

यदि आप क्लिकऑनेंस का उपयोग नहीं करते हैं, तो भी आप प्रति इंस्टॉल इंस्टॉल कर सकते हैं और AllUsers पर पढ़/लिख सकते हैं। एक नया इंस्टॉल (एक अलग फ़ोल्डर में) के परिणामस्वरूप एक अलग हैश और फ़ाइल स्थान होगा; फ़ाइल नाम बदलने के साथ ही। भले ही आप पुराने स्थान को कहीं भी स्टोर करने में कामयाब रहे, फिर भी एक नए इंस्टॉलेशन को पुरानी फ़ाइल के अधिकार नहीं होंगे (कोशिश की गई है)।

आईएसओ EXEName द्वारा भिन्नता को हटा देता है, लेकिन यह My.Settings का उपयोग नहीं करता है। इसके बजाय आप IsolatedFileStreams का उपयोग IsolatedStorageFile ऑब्जेक्ट्स द्वारा बनाए गए हैं। और आपको विभिन्न सेटिंग्स के मूल्यों और नामों का आयोजन और प्रबंधन करना होगा। उपयोग किए गए पृथक भंडारण का प्रकार (ऐप/उपयोगकर्ता) उपलब्ध प्रमाण-पत्रों पर निर्भर करता है।

पृथक भंडारण की जगह है, लेकिन सेटिंग के लिए ओवरकिल लगता है।


आपने उल्लेख किया है कि आप आमतौर पर केवल छोटे ऐप्स के लिए MySettings का उपयोग करते हैं। इस प्रकार, सेटिंग के लिए पथ को स्थिर करने के लिए बस एक स्ट्रॉन्गनाम ओवरकिल लगता है। आईएसओ बहुत दिलचस्प है, लेकिन कुछ आसान है। यह तीसरा विकल्प or other things में आता है जो आप नहीं चाहते थे, लेकिन बहुत लचीला है।

सीरियलाइजेशन के आसपास अपनी खुद की सेटिंग्स कक्षा बनाएं। सरल सेटिंग्स के लिए, ये संभवतः नाम-मूल्य जोड़े {LastPath = "....." के सेट से कहीं अधिक नहीं हैं; फॉर्म लिफ्ट = एक्स; FormTop = y ...}। एक Dictionary(Of String, String) या Dictionary(Of enumSettings, String) में इन सेव करें और बस को क्रमानुसार (बचाने के लिए) पूरे कंटेनर:

Dim bf As New BinaryFormatter 
Using fs As New FileStream(myFile, FileMode.OpenOrCreate) 
    bf.Serialize(fs, _UserOpts) 
End Using 

मान वापस हो रही है बस के रूप में सरल है। अधिक जटिल परियोजनाओं के लिए जहां इंटीजर, डेट, ऐरे, ऐरेलिस्ट, सूची (टी) की तरह सहेजने के कई प्रकार हैं और इसके लिए, उनके लिए एक उपयोगकर्ता ऑप्शन क्लास बनाएं और को क्रमबद्ध करें।

ध्यान दें कि आप धारावाहिकों को एक फाइलस्ट्रीम पास करते हैं, इसलिए आपके पास नाम और स्थान पर पूर्ण नियंत्रण है, जैसे कि C:\Users\<username>\AppData\Local\<Company>\<Product>\Settings.bin स्थान संस्करण, संस्कृति, असेंबली इत्यादि द्वारा स्थानांतरित नहीं होगा। यह आप कहां रखेंगे।

जब आप पॉइंट, साइज और फ़ॉन्ट जैसे प्रकारों को क्रमबद्ध करने का प्रयास करते हैं तो यह स्टीम से बाहर हो जाता है क्योंकि ऑब्जेक्ट्स को सीधे क्रमबद्ध नहीं किया जा सकता है। विशेष रूप से, प्रोटोबफ के साथ इन्हें फ्लाई या पहले से क्रमबद्ध करने के लिए कुछ विकल्प बदलने के लिए कई विकल्प हैं।

+0

सबसे पहले धन्यवाद। जब मुझे ऐसे ऐप को समर्पित करने की आवश्यकता होती है जिसमें बहुत से "महत्वपूर्ण" विकल्प होते हैं तो मैं हमेशा सभी सेटिंग्स को सहेजने/लोड करने के लिए एक आईएनआई फ़ाइल प्रबंधित करता हूं, यही वह है जो मैं इस टिप्पणी के साथ रेफर कर रहा था: '(रजिस्ट्री पर सेटिंग्स को सहेजना नहीं * या अन्य चीजें *), बस मैं आईएनआई फ़ाइल या रजिस्ट्री या "अन्य चीजें" का उपयोग करना बंद करना चाहता हूं क्योंकि माइक्रोसॉफ्ट हमें सेटिंग्स को आसानी से प्रबंधित करने के लिए एक सुविधा देता है, समस्या यह है कि यदि ऐप में बहुत सी सेटिंग्स हैं और आप उसका नाम बदलते हैं ऐप तो सभी सेटिंग्स खो जाती हैं, – ElektroStudios

+0

भी मुझे लगता है कि इस तरह से संभवतः आप एक पोर्टेबल इंस्टॉल नहीं कर सकते हैं (पूर्व परिभाषित सेटिंग्स के साथ मेरा मतलब है कि आप ऐप डीआईआर में आईएनआई फ़ाइल के साथ कर सकते हैं) ... कम से कम सेटिंग्स तक फाइल/डीआईआर स्थान डेवलपर द्वारा परिभाषित नहीं किया जा सकता है। – ElektroStudios

+0

मुझे खेद है, लेकिन मैंने केवल 50% स्पष्टीकरणों के बारे में समझा है, क्या आप यह बता सकते हैं कि यह कैसे करें ?: यदि आप माइक्रोसॉफ्ट प्रतिमान पर 'सब कुछ' जाते हैं, तो आप हैश को स्थिर कर सकते हैं एक एकल, स्थिर स्थान। 'इसका मतलब है कि माइक्रोसॉफ्ट .NET सेटिंग्स सुविधा का उपयोग कर मेरे प्रश्न का समाधान मौजूद है? उस उद्धरण के साथ मजबूत नाम का कुछ संबंध है? मैं थोड़ा सा खो गया हूँ, माफ करना !, और मेरी बुरी अंग्रेजी माफ कर दो। यदि आप जानते हैं कि सवाल को कैसे हल किया जाए तो क्या आप कुछ पंक्तियों में लिख सकते हैं, अगर मैं बहुत ज्यादा नहीं पूछ रहा हूं तो नोबस के लिए एक चरण-दर-चरण मार्गदर्शिका लिख ​​सकता हूं? – ElektroStudios

7

मैं तुम्हें लगता है ConfigurationManager.OpenExeConfiguration विधि का उपयोग कर विशिष्ट स्थान से अपनी कॉन्फ़िगरेशन फ़ाइल भी खोल सकता है।

आशा है कि मैंने मदद की!

संबंधित मुद्दे