सक्रिय app.config फ़ाइल का पथ कैसे खोजें?


167

मैं इस अपवाद हैंडलर को समाप्त करने की कोशिश कर रहा हूं:

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 का उपयोग कर रहा होता हूं।

जवाबों:


363

इसे इस्तेमाल करे

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

आशा करता हूँ की ये काम करेगा


असेंबली का उपयोग करने की कोशिश करने की तुलना में यह बेहतर तरीके से बेहतर है ।etEntryAssembly () + ".config" जो ASP.NET में कुछ स्थितियों में और कुछ स्थितियों में AppDomains का उपयोग करते समय काम नहीं करता है।
कंटीनैगो

4
मैं इस मार्ग को कैसे बदल सकता हूँ?
विग्नेश सुब्रमण्यन

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

1
मेरे लिए काम नहीं किया। यह जवाब हालांकि किया।
काय जेड जेड

4
.Net कोर के बारे में क्या?
jjxtra

64

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

"वैश्विक" कॉन्फ़िगरेशन ( उदा .config) प्राप्त करने के लिए :

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

ConfigurationUserLevelप्रति-उपयोग रोमिंग और गैर-रोमिंग कॉन्फ़िगरेशन फ़ाइलों के लिए विभिन्न मानों का उपयोग करें।


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


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

System.configuration
Black Horus

9

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

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

आपके द्वारा चलाए जा रहे असेंबली का स्थान प्राप्त करने के लिए, प्रयास करें

System.Reflection.Assembly.GetExecutingAssembly().Location

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

6

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


6

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

समस्या सुलझ गयी

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


4

एक और विकल्प जो मैंने देखा वह यहां गायब है:

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

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

3

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


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

3

मैंने एक वेब ऐप में पिछले उत्तरों में से एक की कोशिश की (वास्तव में एक एज़्योर वेब भूमिका स्थानीय रूप से चल रही है) और यह काफी काम नहीं आया। हालांकि, इस तरह के दृष्टिकोण ने काम किया:

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

कॉन्फ़िग फ़ाइल C: \ Program Files \ IIS Express \ MyComponent.dll.config में निकली। इसके लिए दिलचस्प जगह।

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