2009-04-27 13 views
144

मैं इस अपवाद संचालक खत्म करने के लिए कोशिश कर रहा हूँ:सक्रिय app.config फ़ाइल का पथ कैसे ढूंढें?

if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null) 
{ 
    string pathOfActiveConfigFile = ...? 
    throw new ConfigurationErrorsException(
     "You either forgot to set the connection string, or " + 
     "you're using a unit test framework that looks for "+ 
     "the config file in strange places, update this file : " 
     + pathOfActiveConfigFile); 
} 

इस समस्या को केवल मेरा क्या करने के लिए जब मैं NUnit उपयोग कर रहा हूँ लगता है।

उत्तर

315

इस

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 

आशा है कि यह मदद करता है

+0

यह विधानसभा का उपयोग करने की कोशिश करने से बेहतर है। GETEntryAssembly() + ".config" जो ASP.NET में कुछ स्थितियों में और कुछ स्थितियों में AppDomains का उपयोग करते समय काम नहीं करता है। – Contango

+3

मैं इस पथ को कैसे बदल सकता हूं? –

+0

धन्यवाद। मेरे पास एक परियोजना VS2008 -> VS2013 से अपग्रेड की गई थी जिसने app.config फ़ाइल को पढ़ने से इनकार कर दिया था। तब मैंने AppDomain.CurrentDomain.SetupInformation.ConfigurationFile के माध्यम से सीखा कि यह XXX.vshost.exe.config की खोज कर रहा था जो उत्पन्न नहीं किया जा रहा था। तो मैंने इसे प्रोजेक्ट गुण डीबग टैब में वीएस होस्टिंग बंद कर दिया। तब मुझे अपनी app.config फ़ाइल को {projectName} .config पर पुनर्नामित करना पड़ा, इसे बिन फ़ोल्डर में डाल दिया और अंततः – drzounds

8

यदि आप का मतलब है कि जब आप न्यूटिट का उपयोग करते हैं तो आपको केवल शून्य वापसी मिल रही है, तो आपको शायद अपने परीक्षण पुस्तकालय के app.config पर अपने एप्लिकेशन के अपने app.config को कनेक्शनस्ट्रिंग मान कॉपी करने की आवश्यकता है।

जब यह परीक्षण लोडर द्वारा चलाया जाता है, तो परीक्षण असेंबली रनटाइम पर लोड की जाती है और अपने स्वयं के app.config (जिसे संकलित समय पर testAssembly.dll.config पर बदला जाता है) में दिखाई देगा, बल्कि आपके अनुप्रयोग कॉन्फ़िगरेशन फ़ाइल।

प्राप्त करने के लिए विधानसभा द्वारा चलाए जा रहे के स्थान,

System.Reflection.Assembly.GetExecutingAssembly().Location 
+1

सुझाएँ "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" @Cedric Rup से अन्यथा आप ASP.NET में और कुछ में कुछ स्थितियों में एक अपवाद मिल जाएगा AppDomains का उपयोग करते समय स्थितियों। – Contango

3

कोशिश अपने कॉन्फ़िग फ़ाइल System.Reflection.Assembly.GetExecutingAssembly().Location के स्थान आपको क्या चाहिए कर सकते हैं पर निर्भर करता है।

+2

इसके अतिरिक्त, आपके पास एक ही समय में कई "सक्रिय" कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं। Machine.config, फ्रेमवर्क स्तर web.config, ऐप लेवल कॉन्फ़िगरेशन, आदि ... इसलिए मुझे नहीं लगता कि आपके ऐप पर उपलब्ध सभी संभावित कॉन्फ़िगरेशन फ़ाइलों के माध्यम से पार्सिंग के बिना स्वचालित कनेक्शन स्ट्रिंग फ़ाइल स्थान को स्वचालित रूप से ढूंढने का कोई तरीका है। –

5

सुनिश्चित करें कि आप फ़ाइल पर गुण क्लिक करें प्रयास करें और यह स्थापित करने के लिए "कॉपी हमेशा" या यह आपके खुश साथ डीबग \ फ़ोल्डर में नहीं होगा lil dll को कॉन्फ़िगर करने के लिए जहां इसे होना चाहिए और अधिक cowbell

58

कड़ाई से बोलते हुए, कोई भी कॉन्फ़िगरेशन फ़ाइल नहीं है। ASP.NET को छोड़कर इनबिल्ट (System.Configuration) समर्थन का उपयोग करके तीन कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं। मशीन कॉन्फ़िगरेशन के अतिरिक्त: app.exe.config, उपयोगकर्ता रोमिंग और उपयोगकर्ता स्थानीय।

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
        .FilePath 

उपयोग विभिन्न ConfigurationUserLevel प्रति-उपयोग रोमिंग और गैर घूम विन्यास फाइल के लिए मान:

"वैश्विक" विन्यास (exe ​​ .config) प्राप्त करने के लिए।


जो एक पूरी तरह से अलग मॉडल जहां एक बच्चे फ़ोल्डर (आईआईएस-आभासी या फाइल सिस्टम) web.config (सेटिंग के आधार पर) कर सकते हैं की सामग्री के लिए जोड़ सकते हैं या माता पिता के web.config ओवरराइड है।

+2

मैंने पहले "उत्तर" को ऊपर उठाया, जो बहुत उपयोगी था। लेकिन अंत में मुझे वास्तव में इस दृष्टिकोण की आवश्यकता थी, इसलिए इसे यहां भी डालने के लिए धन्यवाद। –

+0

System.configuration –

6

पहली बार मैंने महसूस किया कि इकाई परीक्षण परियोजना है कि परियोजना में app.config बल्कि फिर मेरे उत्पादन कोड परियोजना से जुड़े app.config संदर्भित (बंद बेशक, DOH) मैं सिर्फ एक लाइन पोस्ट इवेंट बिल्ड में जोड़ा प्रोड प्रोजेक्ट का है जो app.config को टेस्ट प्रोजेक्ट के बिन फ़ोल्डर में कॉपी करेगा।

समस्या हल

मैं अब तक किसी भी अजीब दुष्प्रभाव देखा है नहीं है, लेकिन मुझे यकीन है कि यह सही समाधान है नहीं हूँ, लेकिन कम से कम यह काम करने के लिए लगता है।

3

मैंने एक वेब ऐप (वास्तव में एक Azure वेब भूमिका स्थानीय रूप से चल रही) में पिछले उत्तरों में से एक की कोशिश की और यह काफी काम नहीं किया।

var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" }; 
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath; 

कॉन्फ़िग फ़ाइल निकला सी में होना: \ Program Files \ आईआईएस एक्सप्रेस \ MyComponent.dll.config बहरहाल, यह समान दृष्टिकोण काम किया है। इसके लिए दिलचस्प जगह।

3

एक और विकल्प है कि मैंने देखा कि यहाँ याद आ रही है:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE"; 
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE); 
+0

के संदर्भ को जोड़ने के लिए मत भूलना, इसके बारे में अच्छी बात है, जैसा दिखता है है, यह है कि यह .NET मानक 2.0 के अंतर्गत संकलित है। यह .NET कोर 2.0 के तहत शून्य देता है, लेकिन यह माइग्रेशन के दौरान उपयोगी है। – EM0

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