2009-02-07 16 views
6

मेरे पास एक विजुअल स्टूडियो सेटअप प्रोजेक्ट है जिसमें इंस्टॉलर क्लास है। संस्थापक वर्ग में मैं एक सेटिंग सेट इस प्रकार है:मैं इंस्टॉल समय (इंस्टॉलर क्लास के माध्यम से) पर एप्लिकेशन सेटिंग्स कैसे सेट कर सकता हूं

 MessageBox.Show(Properties.Settings.Default.MySetting); 

     Properties.Settings.Default.MySetting = "Foo"; 
     Properties.Settings.Default.Save(); 

     MessageBox.Show(Properties.Settings.Default.MySetting); 

समस्या यह है कि भले ही मुझे पता है कि इस कोड को निष्पादित किया जा रहा है (मैं अन्य सामान कर रहा हूँ), सेटिंग सेट नहीं किया जाता है !!

संदेश बॉक्स सुझाव देते हैं कि मान सेट किया जा रहा है, लेकिन जब मैं .config फ़ाइल पर जाता हूं तो मान अभी भी खाली है!

किसी के पास कोई विचार है और/या संभावित कामकाज क्यों है?

उत्तर

4

मैं अपने इंस्टॉलर्स के लिए क्या करता हूं ऐप.कॉन्फिग में "फ़ाइल" विशेषता का उपयोग करना है। appSettings ब्लॉक इतना की तरह एक "फाइल" विशेषता लेता है,:

<appSettings file="user.config"> 
    <add key="foo" value="some value unchanged by setup"/> 
</appSettings> 

"फाइल" विशेषता, एक तरह से सीएसएस की तरह है कि सबसे अधिक विशिष्ट सेटिंग जीत में। यदि आपके पास user.config के साथ-साथ App.config में "foo" परिभाषित किया गया है, तो user.config में मान का उपयोग किया जाता है।

फिर, मेरे पास एक कॉन्फ़िगर जनरेटर है जो एक डिक्शनरी में मानों का उपयोग करके user.config (या जिसे आप इसे कॉल करना चाहते हैं) पर एक दूसरा ऐप सेटिंग्स ब्लॉक लिखता है।

using System.Collections.Generic; 
using System.Text; 
using System.Xml; 

namespace Utils 
{ 
    public class ConfigGenerator 
    { 
     public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration) 
     { 
      using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8)) 
      { 
       xw.Formatting = Formatting.Indented; 
       xw.Indentation = 4; 
       xw.WriteStartDocument(); 
       xw.WriteStartElement("appSettings"); 

       foreach (KeyValuePair<string, string> pair in userConfiguration) 
       { 
        xw.WriteStartElement("add"); 
        xw.WriteAttributeString("key", pair.Key); 
        xw.WriteAttributeString("value", pair.Value); 
        xw.WriteEndElement(); 
       } 

       xw.WriteEndElement(); 
       xw.WriteEndDocument(); 
      } 
     } 
    } 
} 

अपने संस्थापक में, बस अपने को स्थापित करें विधि में निम्नलिखित की तरह कुछ जोड़ें:

string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar); 

IDictionary<string, string> userConfiguration = new Dictionary<string, string>(); 

userConfiguration["Server"] = Context.Parameters["Server"]; 
userConfiguration["Port"] = Context.Parameters["Port"]; 

ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 

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

उम्मीद है कि इससे मदद मिलती है।

+0

इसके लिए धन्यवाद, ऐसा लगता है कि मैं किस प्रकार के समाधान के बाद हूं। हालांकि मैंने एक समस्या आई है, अगर मैं अपने इंस्टॉलर में इंस्टॉल विधि को ओवरराइड करता हूं, तो कस्टम यूआई के मान संदर्भ पैरामीटर में नहीं हैं। क्या मैं सही विधि का उपयोग कर रहा हूं? चीयर्स – MrEdmundo

+0

अनदेखा करें, मैंने कस्टम एक्शन संपादन स्क्रीन में यूआई से डेटा पारित नहीं किया था। – MrEdmundo

0

मैं ईमानदारी से यह नहीं जानता कि यह इंस्टॉलर के दौरान समर्थित है या नहीं, लेकिन यदि यह है, तो सुनिश्चित करें कि आप पर Save() पर कॉल कर रहे हैं।

+0

मैंने सेटिंग को सेट किया है, लेकिन इसके बावजूद मूल्य वास्तव में सेट नहीं किया जा रहा है! – Calanus

0

ठीक है अंत में मैंने छोड़ दिया और ऐप इंस्टॉल होने के बाद इस सामान को करने के लिए रनऑन प्रकार की विधि थी।

0

संक्षिप्त उत्तर यह है कि यह इंस्टॉलर कक्षाओं में समर्थित नहीं है। आपको बस यह समझने की आवश्यकता है कि इंस्टॉलर क्लास विधियों को msiexec.exe से सिस्टम निर्देशिका से चल रहा है, और यह वातावरण संभवतः यह नहीं जान सकता कि आपके पास निर्देशिका में कहीं भी सेटिंग्स फ़ाइल है जो पूरी तरह से अनजान है। यही कारण है कि यह कोड के साथ काम करता है जो स्पष्ट रूप से फ़ाइल के स्थापित स्थान पर जाता है और वहां अपडेट करता है।

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

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