C # DLL कॉन्फ़िग फ़ाइल


191

Im मेरे DLL में एक app.config फ़ाइल जोड़ने की कोशिश कर रहा है, लेकिन सभी प्रयास विफल रहे हैं।

' एक DLL में कॉन्फ़िगरेशन जानकारी लाना ' में MusicGenesis के अनुसार यह एक समस्या नहीं होनी चाहिए। तो जाहिर है मैं कुछ गलत कर रहा हूँ ...

निम्नलिखित कोड मेरे DLL से मेरे कनेक्शन को लौटाना चाहिए:

return ConfigurationManager.AppSettings["ConnectionString"];

हालाँकि, जब मैं अपने कंसोल एप्लिकेशन पर app.config फ़ाइल की प्रतिलिपि बनाता हूं, तो यह ठीक काम करता है।

कोई विचार?


संदर्भित पोस्ट के अनुसार: यदि dll का नाम MyDll.dll था, तो config फाइल MyDLL.dll.config होनी चाहिए। इसलिए यदि आप dll के भीतर से कॉन्फिग सेटिंग्स पढ़ते हैं, तो उसे अपने कॉन्फिग राइट का संदर्भ देना चाहिए?
मेगाबाइट

11
इससे कोई फर्क नहीं पड़ता कि कोड पूछता है - यह फ़ाइल AppDomain के लिए निर्दिष्ट के रूप में की तलाश में है: AppDomain.CurrentDomain.SetupInformation.ConfigurationFile सेटिंग
मार्क Gravell

एक नोट: "डीएलएल में कॉन्फ़िगरेशन जानकारी डालना" प्रश्न आपके ऐप के कॉन्फ़िगरेशन कोड को लाइब्रेरी में अलग करने के बारे में है जो इसे मुख्य ऐप कोड से अलग रखने के लिए है। यह एक कॉन्फ़िगरेशन फ़ाइल से बहुत अलग है और अपने आप पर एक DLL के लिए विशेष है।
क्रिस अम्मारमैन

इस पोस्ट को देखें [यहाँ लिंक विवरण दर्ज करें] [1], मेरे लिए समाधान था [१]: stackoverflow.com/questions/2389290/…
dhailis

इस पोस्ट को देखें [अलग एप्लीकेशन सेटिंग फ़ाइल को गतिशील रूप से कैसे लोड करें और वर्तमान सेटिंग्स के साथ मर्ज करें?] [1]
हेल्पफू

जवाबों:


277

.DLL, और अच्छे कारण के लिए .NET कॉन्फ़िगरेशन फ़ाइल बनाना तुच्छ नहीं है। .NET कॉन्फ़िगरेशन मैकेनिज्म में ऐप को आसान अपग्रेड / अपडेट करने की सुविधा प्रदान करने के लिए और एक दूसरे को कॉन्फ़िगरेशन फ़ाइलों को रौंदने से इंस्टॉल किए गए ऐप्स को सुरक्षित रखने के लिए बहुत सारी सुविधाएँ हैं।

DLL का उपयोग कैसे किया जाता है और अनुप्रयोग का उपयोग कैसे किया जाता है, इसके बीच एक बड़ा अंतर है। आपके पास एक ही उपयोगकर्ता के लिए एक ही मशीन पर इंस्टॉल किए गए एप्लिकेशन की कई प्रतियां होने की संभावना नहीं है। लेकिन आपके पास बहुत अच्छी तरह से 100 अलग-अलग ऐप या लाइब्रेरी हो सकते हैं जो सभी कुछ .NET DLL का उपयोग कर रहे हैं।

जहां एक उपयोगकर्ता प्रोफ़ाइल के भीतर ऐप की विभिन्न प्रतियों के लिए अलग-अलग सेटिंग्स को ट्रैक करने की आवश्यकता शायद ही हो, यह बहुत संभावना नहीं है कि आप एक DLL के सभी अलग-अलग उपयोगों को एक दूसरे के साथ कॉन्फ़िगरेशन साझा करना चाहते हैं। इस कारण से, जब आप "सामान्य" विधि का उपयोग करके एक कॉन्फ़िगरेशन ऑब्जेक्ट पुनः प्राप्त करते हैं, तो आपके द्वारा वापस प्राप्त की जाने वाली ऑब्जेक्ट उस विशेष डोमेन के बजाय आपके द्वारा निष्पादित किए जा रहे ऐप डोमेन के कॉन्फ़िगरेशन से जुड़ी होती है।

ऐप डोमेन रूट असेंबली के लिए बाध्य है जो आपके कोड को वास्तव में असेंबली में लोड करता है। ज्यादातर मामलों में यह आपके मुख्य .EXE की विधानसभा होगी, जो कि .DLL को लोड करती है। किसी एप्लिकेशन के भीतर अन्य एप्लिकेशन डोमेन को स्पिन करना संभव है, लेकिन आपको स्पष्ट रूप से उस एप्लिकेशन डोमेन की मूल असेंबली के बारे में जानकारी प्रदान करनी होगी।

इस सब के कारण, लाइब्रेरी-विशिष्ट कॉन्फ़िगरेशन फ़ाइल बनाने की प्रक्रिया इतनी सुविधाजनक नहीं है। यह एक ही प्रक्रिया आप किसी विशेष विधानसभा से बंधा नहीं एक मनमाना पोर्टेबल कॉन्फ़िग फ़ाइल बनाने के लिए प्रयोग करेंगे है, लेकिन जिसके लिए आप नेट के XML स्कीमा का उपयोग करना चाहते हैं, विन्यास खंड और config तत्व तंत्र, आदि एक बनाने यह जरूरत पर जोर देता ExeConfigurationFileMapवस्तु , डेटा में लोड करना यह पहचानने के लिए कि कॉन्फिग फाइल कहां जमा होगी, और फिर कॉलिंग ConfigurationManagerOpenMappedExeConfigurationइसे एक नए Configurationउदाहरण में खोलने के लिए। यह ऑटोमैटिक पाथ जनरेशन मैकेनिज्म द्वारा पेश किए गए वर्जन प्रोटेक्शन से आपको काट देगा

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

इसके आस-पास होने का सबसे सुरक्षित और सरल तरीका यह है कि विधानसभा जो आपके DLL को लोड कर रही है, वह भी अपने बारे में कुछ जानकारी प्रदान करे, या संदर्भित विधानसभा के ऐप डोमेन की जांच करके इसका पता लगाए। अपने DLL को संदर्भित करने वाले प्रत्येक ऐप के लिए अलग-अलग उपयोगकर्ता कॉन्फ़िगर फ़ाइलों को रखने के लिए कुछ प्रकार की फ़ोल्डर संरचना बनाने के लिए इसका उपयोग करें।

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


मुझे लगता है कि सिंक तंत्र एक "नामित घटना" आदि होना चाहिए, क्योंकि यह पूरी प्रक्रिया है
जैकब

8
: / मेह। हमारा एक दैत्य उद्यम ऐप है w / main .exe एक अलग टाइमज़ोन में लोगों द्वारा लिखा गया है और मॉड्यूल विभिन्न DLL द्वारा दर्शाए गए हैं और गतिशील रूप से एक कस्टम प्लगइन फ्रेमवर्क के माध्यम से बंधे हैं। यह सब "आपको यह सुनिश्चित करने की आवश्यकता होगी कि कई ऐप आपके DLL का एक साथ उपयोग कर सकते हैं" pomposity बिल्कुल गलत है।
जॉनएल 4

इसके अलावा, अपने करियर के एक बड़े हिस्से में, मैंने इन प्यारे जेनेरिक शेयर्ड-ऑब्जेक्ट मैकेनिज्म को पूरी तरह से नजरअंदाज करते हुए देखा है, जिसमें DLL (या JAR) बनाने वाली टीमें हैं जो केवल एक ही संदर्भ में उपयोग की जा सकती हैं (और मौजूद होनी चाहिए, या ऐप विफल रहता है। )। वे वैधानिक रूप से बाध्य भी हो सकते हैं, लेकिन यह बहुत बुरा है।
JohnL4

1
"सांख्यिकीय रूप से बोलें, तो आप शायद इस लाइब्रेरी का इन-हाउस सेटिंग में उपयोग कर रहे हैं, और यह संभव नहीं है कि आपके पास किसी एक मशीन / उपयोगकर्ता के भीतर कई ऐप का उपयोग हो।" सिद्धांत और व्यवहार के बीच का अंतर मुझे कभी-कभी बहुत मुश्किल हो जाता है।
जॉनएल 4

1
@Panzercrisis, Visual Studio की Settings.settings सुविधा स्वचालित रूप से सभी उपयोगकर्ता सेटिंग्स के लिए संस्करण विशिष्ट पथ बनाती है। देखें: stackoverflow.com/questions/35778528/…
Deantwo

101

अगर आप DLL की कॉन्फिग फ़ाइल से सेटिंग पढ़ना चाहते हैं, लेकिन रूट एप्लिकेशन web.config या app.config से नीचे के कोड को dll में कॉन्फ़िगरेशन को पढ़ने के लिए नहीं।

var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string dllConfigData = appConfig.AppSettings.Settings["dllConfigData"].Value;

VS 2008 सिस्टम के लिए प्रबंधित C ++ में :: कॉन्फ़िगरेशन :: कॉन्फ़िगरेशन ^ appConfig = कॉन्फ़िगरेशन प्रबंधक :: OpenExeConfiguration (विधानसभा :: GetExecutingAssembly () -> स्थान); स्ट्रिंग ^ नाम = appConfig-> AppSettings-> सेटिंग्स ["नाम"] -> मूल्य;
हंस

धन्यवाद, इससे वास्तव में मेरी समस्या हल हो गई। मैं लगभग दो दिनों से इस मुद्दे से निपट रहा हूं, और इसे अभी तक काम नहीं मिला। एक परीक्षण डिबगिंग के रूप में configurationManager मशीन से पढ़ रहा था ।config -I मुझे लगता है-, क्योंकि कनेक्शन स्ट्रिंग्स को बाहर निकाला गया था SQLExpress -connection स्ट्रिंग के बारे में मैं सूचीबद्ध नहीं था-।
yopez83

19

मुझे भी यही समस्या थी और कई घंटों तक वेब पर सर्च किया लेकिन मुझे कोई हल नहीं मिला इसलिए मैंने अपना बनाया। मैंने सोचा कि क्यों .net कॉन्फ़िगरेशन सिस्टम इतना अनम्य है।

बैकग्राउंड: मैं अपने DAL.dll को डेटाबेस और DAL सेटिंग्स के लिए अपनी खुद की कॉन्फिग फाइल रखना चाहता हूं। मुझे एंटरप्राइज लाइब्रेरी और अपने स्वयं के विन्यास के लिए app.config की भी आवश्यकता है। इसलिए मुझे app.config और dll.config दोनों चाहिए।

जो मैं नहीं करना चाहता था वह ऐप से मेरी डीएएल परत तक हर संपत्ति / सेटिंग से होकर गुजरना है!

"AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" को मोड़ना संभव नहीं है क्योंकि मुझे इसे सामान्य app.config व्यवहार के लिए चाहिए।

मेरी आवश्यकताएं / दृष्टिकोण थे:

  • ClassLibrary1.dll.config से WindowsFormsApplication1.exe.config तक किसी भी चीज़ की मैन्युअल कॉपी नहीं क्योंकि यह अन्य डेवलपर्स के लिए अप्राप्य है।
  • मजबूत टाइपिंग के गुणों को बनाए रखें "Properties.Settings.Default.NameOfValue" (सेटिंग्स व्यवहार) क्योंकि मुझे लगता है कि यह एक प्रमुख विशेषता है और मैं इसे खोना नहीं चाहता था
  • मुझे पता चला कि ApplicationSettingsBase की कमी को आपकी अपनी / कस्टम कॉन्फ़िग फ़ाइल या प्रबंधन को इंजेक्ट करना है (इन वर्गों में सभी आवश्यक फ़ील्ड निजी हैं)
  • "configSource" फ़ाइल पुनर्निर्देशन का उपयोग संभव नहीं है क्योंकि हमें ClassLibrary1.dll.config की प्रतिलिपि बनाना / फिर से लिखना होगा और कई वर्गों के लिए कई XML फाइलें प्रदान करना होगा (मुझे भी यह पसंद नहीं आया)
  • मैं इस सरल कार्य के लिए अपने स्वयं के SettingsProvider लिखना पसंद नहीं करता था क्योंकि MSDN से पता चलता है क्योंकि मैंने सोचा था कि बस बहुत अधिक होगा
  • मुझे केवल कॉन्फिगरेशन फाइल से सेक्शन एप्लिकेशन और कनेक्शनस्ट्रीम की जरूरत है

मैं Settings.cs फ़ाइल को संशोधित करने के साथ आया और एक विधि लागू की जो ClassLibrary1.dll.config को खोलती है और एक निजी क्षेत्र में अनुभाग जानकारी पढ़ती है। उसके बाद, मैंने इस [स्ट्रिंग प्रॉपर्टीनेम] को "ओवरराइड" कर दिया है, इसलिए जेनरेट की गई सेटिंग्स .esginer.cs बेस क्लास के बजाय मेरी नई प्रॉपर्टी में कॉल करती है। वहां सेटिंग को सूची से बाहर पढ़ा जाता है।

अंत में निम्नलिखित कोड है:

internal sealed partial class Settings
{
    private List<ConfigurationElement> list;

    /// <summary>
    /// Initializes a new instance of the <see cref="Settings"/> class.
    /// </summary>
    public Settings()
    {
        this.OpenAndStoreConfiguration();
    }

    /// <summary>
    /// Opens the dll.config file and reads its sections into a private List of ConfigurationElement.
    /// </summary>
    private void OpenAndStoreConfiguration()
    {
        string codebase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
        Uri p = new Uri(codebase);
        string localPath = p.LocalPath;
        string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath);
        string sectionGroupName = "applicationSettings";
        string sectionName = executingFilename + ".Properties.Settings";
        string configName = localPath + ".config";
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = configName;
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

        // read section of properties
        var sectionGroup = config.GetSectionGroup(sectionGroupName);
        var settingsSection = (ClientSettingsSection)sectionGroup.Sections[sectionName];
        list = settingsSection.Settings.OfType<ConfigurationElement>().ToList();

        // read section of Connectionstrings
        var sections = config.Sections.OfType<ConfigurationSection>();
        var connSection = (from section in sections
                           where section.GetType() == typeof(ConnectionStringsSection)
                           select section).FirstOrDefault() as ConnectionStringsSection;
        if (connSection != null)
        {
            list.AddRange(connSection.ConnectionStrings.Cast<ConfigurationElement>());
        }
    }

    /// <summary>
    /// Gets or sets the <see cref="System.Object"/> with the specified property name.
    /// </summary>
    /// <value></value>
    public override object this[string propertyName]
    {
        get
        {
            var result = (from item in list
                         where Convert.ToString(item.ElementInformation.Properties["name"].Value) == propertyName
                         select item).FirstOrDefault();
            if (result != null)
            {
                if (result.ElementInformation.Type == typeof(ConnectionStringSettings))
                {
                    return result.ElementInformation.Properties["connectionString"].Value;
                }
                else if (result.ElementInformation.Type == typeof(SettingElement))
                {
                    return result.ElementInformation.Properties["value"].Value;
                }
            }
            return null;
        }
        // ignore
        set
        {
            base[propertyName] = value;
        }
    }

आपको बस अपने आवेदन की आउटपुट निर्देशिका में ClassLibrary1 आउटपुट निर्देशिका से अपने ClassLibrary1.dll.config को कॉपी करना होगा। शायद किसी को यह उपयोगी लगेगा।


14

कॉन्फ़िगरेशन प्रबंधक का उपयोग करते समय, मुझे पूरा यकीन है कि यह प्रक्रिया / AppDomainकॉन्फ़िगरेशन फ़ाइल (app.config / web.config) लोड कर रहा है । यदि आप एक विशिष्ट कॉन्फ़िग फ़ाइल लोड करना चाहते हैं, तो आपको विशेष रूप से उस फ़ाइल को नाम से पूछना होगा ...

तुम कोशिश कर सकते हो:

var config = ConfigurationManager.OpenExeConfiguration("foo.dll");
config.ConnectionStrings. [etc]

संदर्भित पोस्ट के अनुसार: यदि dll का नाम MyDll.dll था, तो config फाइल MyDLL.dll.config होनी चाहिए। तो अगर आप dll के भीतर से कॉन्फिग सेटिंग्स पढ़ते हैं, तो उसे अपने कॉन्फिग राइट का संदर्भ देना चाहिए?
मेगाबाइट

1
नहीं, मुझे ऐसा नहीं लगता। "डीएलएल के साथ" कोई बाधा नहीं बनाता है; my.exe.config: डिफ़ॉल्ट रूप से, यह कॉन्फ़िग फ़ाइल AppDomain के लिए परिभाषित कर रहा है
मार्क Gravell

1
विशेष रूप से, AppDomain.CurrentDomain.SetupInformation.ConfigurationFile सेटिंग।
मार्क Gravell

नोट: मैंने OpenExeConfiguration की कोशिश की, और मुझे यकीन नहीं है कि काम करता है, या तो। शायद app.config के साथ कॉन्फ़िगर करें?
मार्क Gravell

यह किया जा सकता है ... लेकिन एक EXE के लिए app.config फ़ाइल के समान समर्थन और सुरक्षा के साथ नहीं। मेरा जवाब देखिए।
क्रिस अम्मारमैन

13

ConfigurationManager.AppSettings आवेदन के लिए परिभाषित सेटिंग्स लौटाता है, विशिष्ट DLL के लिए नहीं, आप उन्हें एक्सेस कर सकते हैं लेकिन यह एप्लिकेशन सेटिंग्स है जो वापस आ जाएगी।

यदि आप किसी अन्य एप्लिकेशन से dll का उपयोग कर रहे हैं, तो एप्लिकेशन के एप्लिकेशन में कनेक्शनString हो जाएगा।


6

मुझे पता है कि यह पार्टी के लिए देर से है, हालांकि मुझे लगा कि मैं DLL के लिए उपयोग किए जाने वाले समाधान को साझा करूंगा।

मैं सोच के KISS स्कूल का अधिक रहा हूँ, ताकि जब मैं एक नेट DLL जहां यह जाता है, आदि मैं बस एक "config" वर्ग केवल सार्वजनिक गुण है कि बनाने कि नियंत्रण यह कैसे काम करता बाह्य डेटा अंक संग्रहीत करना चाहता है या कि है उस सभी डेटा बिंदुओं को संग्रहीत करें जिसकी उसे आवश्यकता है और मैं यह चाहूंगा कि परिवर्तन करने के लिए इसे पुन: जमा करने से रोकने के लिए DLL पर बाहरी नियंत्रण किया जा सके। तब मैं एक फ़ाइल में वर्ग के ऑब्जेक्ट प्रतिनिधित्व को बचाने और लोड करने के लिए .Net के XML सीरियललाइज़िंग का उपयोग करता हूं।

फिर इसे पढ़ने और इसे एक्सेस करने के लिए, एक सिंगलटन, एक स्थिर उपयोगिता वर्ग, विस्तार विधियों आदि से बहुत सारे तरीके हैं। यह इस बात पर निर्भर करता है कि आपका DLL कैसे संरचित है और कौन सी विधि आपके DLL को सबसे अच्छी तरह फिट करेगी।


मैं इस दृष्टिकोण का उपयोग करता हूं और अब तक जिस तरह से काम किया है, उससे खुश हूं।
डेव

4

आप सही हैं, आप एक dll की कॉन्फिग फाइल पढ़ सकते हैं। मैं एक दिन के लिए इससे जूझता रहा जब तक मुझे पता नहीं चला कि मेरी कॉन्फिग फाइल मुद्दा थी। नीचे मेरा कोड देखें। यह चलाने में सक्षम था।

        ExeConfigurationFileMap map = new ExeConfigurationFileMap();
        map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config";
        Configuration libConfig = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        AppSettingsSection section = (libConfig.GetSection("appSettings") as AppSettingsSection);
        Console.WriteLine(section.Settings["dnd_shortcodes"].Value);

मेरे Plugin1.dll.configनीचे के रूप में देखा;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <appSettings>
  <add key="cmd_location" value="http://..."/>
  <add key="dnd_shortcodes" value="142,145,146,157,165,167,168,171,173,176,178,404,40"/>
 </appSettings>
</configuration>

मुझे पता चला कि मेरी कॉन्फ़िग फ़ाइल में <appSettings>टैग की कमी थी , इसलिए चारों ओर देखें, आपका मुद्दा अलग हो सकता है लेकिन मेरा अभी तक नहीं।


3

चूंकि असेंबली अस्थायी कैश में रहती है, इसलिए आपको dll का कॉन्फ़िगरेशन प्राप्त करने के लिए पथ को संयोजित करना चाहिए:

var appConfig = ConfigurationManager.OpenExeConfiguration(
    Path.Combine(Environment.CurrentDirectory, Assembly.GetExecutingAssembly().ManifestModule.Name));

"Path.Combine (Environment.CurrentDirectory, Assembly.GetExecutingAssembly ()। ManifestModule.Name) के बजाय" आप "असेंबली का उपयोग कर सकते हैं।
GetExecutingAssembly

3

यदि आप पुस्तकालयों का उपयोग कर रहे हैं जो कि WCF जैसे दृश्यों के पीछे बड़ी मात्रा में भ्रम की स्थिति देखते हैं, तो आप ऐसा करने पर विचार कर सकते हैं:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "MyWcfClientWrapper.dll.config");

या पावरशेल में:

[AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "MyWcfClientWrapper.dll.config")

IMO यह तकनीक एक कोड गंध है और वास्तव में केवल तदर्थ स्क्रिप्टिंग में उपयोग के लिए उपयुक्त है। यदि आप अपने आप को उत्पादन कोड में ऐसा करना चाहते हैं, तो शायद यह एक वास्तुशिल्प समीक्षा का समय है।

निम्नलिखित की सिफारिश नहीं की गई है:
एक तकनीकी जिज्ञासा के रूप में, यहां विषय पर भिन्नता है। आप DLL में रखे गए वर्गों में से एक के अंदर एक स्टैटिक कंस्ट्रक्टर बना सकते हैं, और वहां से यह कॉल कर सकते हैं। मैं अंतिम उपाय के रूप में छोड़कर ऐसा करने की सलाह नहीं दूंगा।


3

पूर्ण समाधान अक्सर एक ही स्थान पर नहीं पाया जाता है ...

1) एक एप्लिकेशन कॉन्फ़िग फ़ाइल बनाएं और इसे "yourDllName.dll.config" नाम दें।
2) VS समाधान एक्सप्लोरर में ऊपर बनाई गई कॉन्फ़िग फ़ाइल पर राइट क्लिक करें, गुण क्लिक करें
--- सेट "एक्शन बनाएँ" = सामग्री
--- सेट "आउटपुट निर्देशिका में कॉपी करें" = हमेशा
3) कॉन्फ़िगरेशन फ़ाइल (yourDllName.dll.config) के लिए एक appSettings अनुभाग अपने yourKeyName और yourKeyValue के साथ जोड़ें

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="yourKeyName" value="yourKeyValue"/>
  </appSettings>
</configuration>

4) अपने dll / वर्ग / परियोजना संदर्भों में System.Configuration जोड़ें
5) अपने कोड में उन उपयोग कथनों को जोड़ें जहां आप कॉन्फिग सेटिंग पर पहुंचने का इरादा रखते हैं

using System.Configuration;
using System.Reflection;

6) मूल्य तक पहुँचने के लिए

string keyValue = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location).AppSettings.Settings["yourKeyName"].Value;

7) आनन्द, यह काम करता है

IMHO, इसका उपयोग केवल एक नया dll / पुस्तकालय विकसित करते समय किया जाना चाहिए।

#if (DEBUG && !FINALTESTING)
   string keyValue = ConfigurationManager.OpenExeConfiguration...(see 6 above)
#else
   string keyValue = ConfigurationManager.AppSettings["yourKeyName"];
#endif

जब आप अपने वास्तविक एप्लिकेशन में dll के ऐपसेटिंग को जोड़ते हैं, तो कॉन्फ़िगरेशन फ़ाइल एक महान संदर्भ बन जाती है।


3

इस कॉन्फिग फाइल की तरह लगता है वास्तव में स्पष्ट करने के लिए भ्रमित कर रहे हैं के रूप में उनके व्यवहार देव वातावरण से तैनाती के लिए बदलता है। जाहिरा तौर पर एक DLL की अपनी कॉन्फिग फाइल हो सकती है, लेकिन एक बार जब आप dll (एक साथ उनकी कॉन्फिग फाइल) को कॉपी और पेस्ट कर देते हैं, तो पूरी चीज काम करना बंद कर देती है। एकमात्र समाधान मैन्युअल रूप से app.config फ़ाइलों को एक फ़ाइल में मर्ज करना है, जो केवल निष्पादन द्वारा उपयोग किया जाएगा। उदाहरण के लिए myapp.exe में myapp.exe.config फ़ाइल होगी जिसमें myapp.exe द्वारा उपयोग किए जाने वाले सभी dll के लिए सभी सेटिंग्स होती हैं। मैं VS 2008 का उपयोग कर रहा हूं।


2

मैंने पाया है कि इस मुद्दे का एक अच्छा समाधान क्या लगता है। मैं VS 2008 C # का उपयोग कर रहा हूं। मेरे समाधान में कई कॉन्फ़िगरेशन फ़ाइलों के बीच अलग नामस्थान का उपयोग शामिल है। मैंने अपने ब्लॉग पर समाधान पोस्ट किया है: http://tommiecarter.blogspot.com/2011/02/how-to-access-multiple-config-files-in.html

उदाहरण के लिए:

यह नामस्थान dll सेटिंग पढ़ / लिखता है:

var x = company.dlllibrary.Properties.Settings.Default.SettingName;
company.dlllibrary.Properties.Settings.Default.SettingName = value;

यह नाम स्थान सेटिंग्स को पढ़ा / लिखता है:

company.exeservice.Properties.Settings.Default.SettingName = value;
var x = company.exeservice.Properties.Settings.Default.SettingName;

लेख में कुछ कैविएट का उल्लेख किया गया है। HTH


1

जैसा कि मार्क कहते हैं, यह संभव नहीं है (हालांकि विज़ुअल स्टूडियो आपको क्लास लाइब्रेरी प्रोजेक्ट में एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल जोड़ने की अनुमति देता है)।

आप की जाँच करने के लिए चाहते हो सकता है AssemblySettings वर्ग जो विधानसभा विन्यास फाइल को संभव बनाने के लिए लगता है।


0

इस पोस्ट में इसी तरह की समस्या पर चर्चा की गई और मेरी समस्या का समाधान किया गया कि कैसे एक अलग एप्लिकेशन सेटिंग को गतिशील रूप से लोड किया जाए और वर्तमान सेटिंग्स के साथ मर्ज किया जाए? हेल्पफू हो सकता है


जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
आदि

0

एक dll के लिए, इसे कॉन्फ़िगरेशन पर निर्भर नहीं होना चाहिए क्योंकि कॉन्फ़िगरेशन अनुप्रयोग के स्वामित्व में है और dll द्वारा नहीं।

यह यहाँ समझाया गया है


0

आप इस कोड का उपयोग कर सकते हैं:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace GClass1
{
[Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface _GesGasConnect
{
    [DispId(1)]
    int SetClass1Ver(string version);


}

[Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("InterfacesSMS.Setting")]
public class Class1 : _Class1
{
    public Class1() { }


    public int SetClass1(string version)
    {
        return (DateTime.Today.Day);
    }
}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.