2008-10-02 5 views
15

मैं कमांड लाइन पैरामीटर पास करके मानक app.config के उपयोग को ओवरराइड करना चाहता हूं। मैं डिफ़ॉल्ट एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल कैसे बदलूं ताकि जब मैं ConfigurationManager.AppSettings तक पहुंचूं, तो मैं कमांड लाइन पर निर्दिष्ट कॉन्फ़िगरेशन फ़ाइल तक पहुंच रहा हूं?मैं कमांड लाइन पैरामीटर से .NET अनुप्रयोग कॉन्फ़िगरेशन फ़ाइल का चयन कैसे करूं?

संपादित करें:

ऐसा लगता है कि एक कॉन्फ़िग फ़ाइल कि EXE प्लस .config के नाम से अलग है लोड करने के लिए सही तरीका OpenMappedExeConfiguration उपयोग करने के लिए है। जैसे

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); 
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Shell2.exe.config"); 
currentConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None); 

यह आंशिक रूप से काम करता है। मैं ऐप सेटिंग्स अनुभाग में सभी कुंजी देख सकता हूं लेकिन सभी मान शून्य हैं।

उत्तर

13

तो यहाँ कोड है कि वास्तव में मुझे वास्तव में एक config डिफ़ॉल्ट के अलावा अन्य फ़ाइल में appSettings अनुभाग का उपयोग करने की अनुमति देता है।

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); 
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Alternate.config"); 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None); 

AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings"); 
string MySetting = section.Settings["MySetting"].Value; 
+1

अच्छा समाधान, साझा करने के लिए धन्यवाद। –

2

एक बैच फ़ाइल जो आपकी वांछित कॉन्फ़िगरेशन फ़ाइल को appname.exe.config पर कॉपी करती है और फिर appname.exe चलाती है।

+0

सभी समर्थन लड़कों और gals के लिए धन्यवाद। जबकि आप इसे पसंद नहीं कर सकते हैं, यह काम करता है। हाल ही में, मेरा दृष्टिकोण एक-सी = file.config और एक सामान्य कंसोल ऐप और एक डैरल दृष्टिकोण है। मेरे पास अभी भी जेनेरिक कंसोल ऐप है .app को निष्क्रिय करने के लिए theapp.exe.config फ़ाइल को theapp.exe पर कॉपी करता है। – kenny

+1

यह एकमात्र उत्तर है (स्वीकृत एक सहित) जो वास्तव में मूल वांछित परिणाम किसी भी तरह से प्राप्त करता है। –

+0

इस समाधान के कई नुकसान हैं। सबसे महत्वपूर्ण एक: जहां तक ​​मुझे पता है कि किसी एप्लिकेशन को प्रोग्राम फ़ाइलें फ़ोल्डर के नीचे किसी भी फाइल को संशोधित नहीं करना चाहिए। तो सामान्य रूप से exe फ़ाइल के बगल में कॉन्फ़िगरेशन फ़ाइल को रखने में क्या अर्थ होता है? एप्लिकेशन तब अपनी कॉन्फ़िगरेशन को संशोधित करने में सक्षम नहीं है। उपयोगकर्ता की होम निर्देशिका के तहत एप्लिकेशन की कॉन्फ़िगरेशन को सामान्य रूप से रखना एक अच्छी शैली है। हालांकि, सिस्टम-व्यापी कॉन्फ़िगरेशन फ़ाइलों को रखने के लिए विंडोज़ में अभी भी केंद्रीय कॉन्फ़िगरेशन फ़ाइल निर्देशिका जैसे/etc की कमी है। – realtime

0

यह वही नहीं है जो आप चाहते हैं ... वास्तविक ConfigurationManager स्थिर ऑब्जेक्ट को एक अलग पथ पर इंगित करने के लिए रीडायरेक्ट ऑब्जेक्ट को रीडायरेक्ट करने के लिए। लेकिन मुझे लगता है कि यह आपकी समस्या का सही समाधान है। ConfigurationManager कक्षा पर OpenExeConfiguration विधि देखें। उपरोक्त विधि नहीं है कि तुम क्या देख रहे हैं के लिए मुझे लगता है कि यह भी उद्यम लाइब्रेरी ढांचे के Configuration capabilities का उपयोग कर पर एक नज़र लेने लायक होगा

(विकसित और माइक्रोसॉफ्ट पैटर्न & आचरण टीम द्वारा बनाए रखा)।

विशेष रूप से FileConfigurationSource कक्षा पर एक नज़र डालें।

यहां कुछ कोड है जो Enterprise Library से उपयोग पर प्रकाश डाला गया है, मुझे विश्वास है कि यह आपके लक्ष्यों को पूरी तरह से पूरा करता है। इसके लिए एंट लिब से आपको एकमात्र असेंबली की आवश्यकता है Microsoft.Practices.EnterpriseLibrary.Common.dll

static void Main(string[] args) 
{ 
    //read from current app.config as default 
    AppSettingsSection ass = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings; 

    //if args[0] is a valid file path assume it's a config for this example and attempt to load 
    if (args.Length > 0 && File.Exists(args[0])) 
    { 
     //using FileConfigurationSource from Enterprise Library 
     FileConfigurationSource fcs = new FileConfigurationSource(args[0]); 
     ass = (AppSettingsSection) fcs.GetSection("appSettings"); 
    } 

    //print value from configuration 
    Console.WriteLine(ass.Settings["test"].Value); 
    Console.ReadLine(); //pause 
} 
+0

इस उदाहरण के बारे में अजीब चीज यह है कि यह डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल लोड करेगा। अगर मैं exePath को कुछ और करने के लिए बदलता हूं तो OpenExe कॉन्फ़िगरेशन विफल हो जाता है। –

+0

मैं आपको अगले 20 मिनट में एक कोड नमूना प्राप्त करने जा रहा हूं, लेकिन मैं आगे बढ़ गया और एक संभावित विकल्प के साथ अद्यतन किया। –

+0

विडंबना यह है कि यह एप्लिकेशन वास्तव में पी एंड पी समूह से सीएबी का उपयोग कर रहा है, हालांकि, मैंने सभी एंटीलिब सामान निकाले हैं क्योंकि यह मेरे लिए अधिक है। मैं फ़ोल्डर में एक एक्सएमएल फ़ाइल भरने के बारे में गंभीरता से सोच रहा हूँ। यह बहुत आसान होगा। –

1

मैं भी मेरा किसी एप्लिकेशन के लिए यह करने के लिए की जरूरत है, और मानक config वस्तुओं में इस तरह के एक सरल अवधारणा के लिए इस तरह के एक 'freakin परेशानी में बदल के साथ काम है कि मैं इस मार्ग चला गया:

  1. समान XML स्वरूप में कई config फ़ाइलें रखें एक डेटासेट (.ReadXML के माध्यम से) में
  2. लोड निर्दिष्ट कॉन्फ़िग फ़ाइल app.config करने के लिए, और मेरे Configu के रूप में यह में config जानकारी के साथ DataTable का उपयोग राशन ऑब्जेक्ट
  3. तो मेरा सभी कोड मूल्यों को पुनर्प्राप्त करने के लिए कॉन्फ़िगरेशन डेटाटेबल से संबंधित है और न कि क्रिप्टैस्टिक रूप से obfuscated ऐप कॉन्फ़िगरेशन ऑब्जेक्ट।

तो मैं जो कुछ भी config फ़ाइल नाम मैं कमांड लाइन पर की जरूरत है पारित कर सकते हैं और अगर एक वहाँ नहीं है - बस डेटासेट में app.config लोड।

जीज़स इसके बाद बहुत आसान था।:-)

रॉन

+0

मैं आपको सुनता हूं। मैं उस दिन की प्रतीक्षा करता हूं जब मुझे एहसास होता है, ओह .config फ़ाइलों का उपयोग करने का लाभ है। वह दिन नहीं आया है। –

1

इस एप्लिकेशन के लिए स्रोत की प्रासंगिकता का डिफ़ॉल्ट config का उपयोग करता है और कमांड लाइन के माध्यम से ओवरराइड स्वीकार करता है जो:

कॉन्फ़िग वस्तु

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
string defCfgName = Environment.GetCommandLineArgs()[0] + ".config"; 

if (arg.Length != 0) 
{ 
    string ConfigFileName = arg[0]; 
    if (!File.Exists(ConfigFileName)) 
     Fatal("File doesn't exist: " + ConfigFileName, -1);     
    config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = ConfigFileName }, ConfigurationUserLevel.None); 
} 
else if (!File.Exists(defCfgName)) Fatal("Default configuration file doesn't exist and no override is set." , -1); 

में वर्तमान या उपयोगकर्ता config जाओ कॉन्फ़िगरेशन ऑब्जेक्ट का उपयोग करें

AppSettingsSection s = (AppSettingsSection)config.GetSection("appSettings"); 
KeyValueConfigurationCollection a = s.Settings; 
ConnectionString = a["ConnectionString"].Value; 
संबंधित मुद्दे