একটি লাইব্রেরির জন্য 'app.config' সমান (ডিএলএল)


149

app.configগ্রন্থাগারের (ডিএলএল) সমতুল্য কি আছে ? যদি তা না হয় তবে কোনও লাইব্রেরির জন্য নির্দিষ্ট কনফিগারেশন সেটিংস সঞ্চয় করার সহজ উপায় কী? দয়া করে বিবেচনা করুন যে গ্রন্থাগারটি বিভিন্ন অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হতে পারে।

উত্তর:


161

আপনি করতে পারেন পৃথক কনফিগারেশন ফাইল আছে, কিন্তু আপনি এটি "ম্যানুয়ালি" পড়তে, থাকবে ConfigurationManager.AppSettings["key"]শুধু সমাবেশ চলমান কনফিগ পড়বে।

ধরে নিই যে আপনি ভিজুয়াল স্টুডিওটিকে আপনার আইডিই হিসাবে ব্যবহার করছেন, আপনি ডানদিকে পছন্দসই প্রকল্পটি ক্লিক করতে পারেন → নতুন আইটেমটি → অ্যাপ্লিকেশন কনফিগারেশন ফাইলটি

এটি App.configপ্রকল্প ফোল্ডারে যোগ করবে , <appSettings>বিভাগের অধীনে আপনার সেটিংসটি সেখানে রাখবে । আপনি যদি ভিজ্যুয়াল স্টুডিওটি ব্যবহার না করে এবং ম্যানুয়ালি ফাইলটি যুক্ত না করে থাকেন তবে অবশ্যই এটির নাম দিন: DllName.dll.config অবশ্যই নিশ্চিত করুন , অন্যথায় নীচের কোডটি সঠিকভাবে কাজ করবে না।

এখন এই ফাইলটি থেকে পড়তে যেমন ফাংশন থাকে:

string GetAppSetting(Configuration config, string key)
{
    KeyValueConfigurationElement element = config.AppSettings.Settings[key];
    if (element != null)
    {
        string value = element.Value;
        if (!string.IsNullOrEmpty(value))
            return value;
    }
    return string.Empty;
}

এবং এটি ব্যবহার করতে:

Configuration config = null;
string exeConfigPath = this.GetType().Assembly.Location;
try
{
    config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
}
catch (Exception ex)
{
    //handle errror here.. means DLL has no sattelite configuration file.
}

if (config != null)
{
    string myValue = GetAppSetting(config, "myKey");
    ...
}

কনফিগারেশনম্যানেজার ক্লাসটি উপলভ্য করতে আপনাকে সিস্টেমের কনফিগারেশন নেমস্পেসেও রেফারেন্স যুক্ত করতে হবে।

প্রকল্পটি তৈরি করার সময়, ডিএলএল ছাড়াও আপনার DllName.dll.configফাইলও থাকতে হবে, এটিই আপনাকে নিজেরাই ডিএলএল দিয়ে প্রকাশ করতে হবে।

উপরেরটি হল বেসিক স্যাম্পল কোড, পূর্ণ স্কেল উদাহরণে আগ্রহী তাদের জন্য, দয়া করে এই অন্যান্য উত্তরটি দেখুন


1
@ রডনি এর string exeConfigPath = this.GetType().Assembly.Location;মতো কিছুতে পরিবর্তনের চেষ্টা করুন :string exeConfigPath = @"C:\MyFolder\DllFolder\ExeName.exe";
শেডো উইজার্ড আপনার জন্য ইয়ার ইয়ার ইয়ার

1
যদি dll পুনঃভাগী ইউনিট পরীক্ষার সরঞ্জাম দ্বারা কোনও অজানা ফোল্ডারে অনুলিপি করা হয় তবে এটি কীভাবে করবেন?
অটোডিডাক্ট

11
এটি প্রয়োগকারী অন্য যে কোনও ব্যক্তির জন্য একটি পরামর্শ: অ্যাপ্লিকেশনগুলি উল্লেখ করে DllName.dll.config প্রজন্মকে স্বয়ংক্রিয় করার জন্য, আমি কেবল অ্যাপ্লিকেশন কনফিগের নাম পরিবর্তন করে DllName.dll.config রেখেছি এবং "কপিরাইট টু আউটপুট ডিরেক্টরি" সম্পত্তিটি "সর্বদা অনুলিপি" করে রেখেছি । এছাড়াও, আমার প্রয়োজনটি ছিল সংযোগের স্ট্রিংগুলির জন্য, যা কনফিগারেশনস্ট্রিংগুলি ব্যবহার করে পুনরুদ্ধার করা যেতে পারে on
জেফ জি

2
appcfg ফাইলগুলির নাম পড়ার জন্য app.cfg ফাইলের নামটি অত্যন্ত গুরুত্বপূর্ণ, ফাইলটির নামটি "DLL_NAME.DLL.CONFIG" হওয়া উচিত
সাদ্দামবিনশেড

2
আমার শেষ মন্তব্যে সংশোধন। আমার ভিএস ২০১7 সলিউশনে, আমার পরীক্ষা ও ডিএলএল প্রকল্পগুলি থেকে আমার নতুন, অ-কর্মক্ষম অ্যাপ.config ফাইলগুলি সরিয়ে এবং এটি আমার পরীক্ষার প্রকল্পে পুনরায় যুক্ত করে এটি হঠাৎ কাজ শুরু করে! আমার App.config সেটিং এখন স্বয়ংক্রিয়ভাবে DLL.configs- এ অন্তর্ভুক্ত হবে। কি শান্তি!
জেক 2

30

দুর্ভাগ্যক্রমে, আপনার কাছে এক্সিকিউটেবলের জন্য কেবল একটি app.config ফাইল থাকতে পারে, সুতরাং আপনার যদি DLL আপনার অ্যাপ্লিকেশনটিতে লিঙ্ক থাকে তবে তাদের নিজস্ব app.config ফাইল থাকতে পারে না।

সমাধানটি হ'ল: আপনার ক্লাস লাইব্রেরির প্রকল্পে App.config ফাইল লাগানোর দরকার নেই।
আপনি আপনার ক্লাস লাইব্রেরির dll উল্লেখ করে এমন অ্যাপ্লিকেশনটিতে App.config ফাইলটি রেখে দিয়েছেন।

উদাহরণস্বরূপ, ধরা যাক যে আমাদের কাছে MyClasses.dll নামে একটি শ্রেণিবদ্ধ গ্রন্থাগার রয়েছে যা অ্যাপকনফিগ ফাইলটি এর মতো ব্যবহার করে:

string connect = 
ConfigurationSettings.AppSettings["MyClasses.ConnectionString"];

এখন, আসুন আমরা মাই অ্যাপ্লা.সেক্স নামে একটি উইন্ডোজ অ্যাপ্লিকেশন পেয়েছি যা মাই ক্লাস.ডিল উল্লেখ করে। এটিতে এমন একটি এন্ট্রি সহ একটি অ্যাপকনফাইগ থাকবে:

<appSettings>
    <add key="MyClasses.ConnectionString"
         value="Connection string body goes here" />
</appSettings>

অথবা

একটি এক্সএমএল ফাইল অ্যাপকনফাইগের জন্য সেরা সমতুল্য। প্রয়োজন অনুসারে এক্সএমএল সিরিয়ালাইজ / ডিসরিয়ালাইজ ব্যবহার করুন। আপনি যা চান তা এটি কল করতে পারেন। যদি আপনার কনফিগারেশনটি "স্থিতিশীল" হয় এবং পরিবর্তনের প্রয়োজন না হয় তবে আপনি এটি এম্বেডড রিসোর্স হিসাবে প্রকল্পে যুক্ত করতে পারেন।

আশা করি এটি কিছু আইডিয়া দেয়


6
ConfigurationSettingsএখন অপ্রচলিত এবং প্রতিস্থাপন করা হয়েছে ConfigurationManager, সুতরাং ConfigurationManager.AppSettings
সমতুল্যটি

2
নিচে ভোট প্রশ্নটি প্রতি অ্যাপ্লিকেশনটিতে নয়, ডেল প্রতি হয়। সবচেয়ে ভালো সমাধান: stackoverflow.com/a/5191101/2935383
raiserle

3
আমি সন্দেহ করি যে এই পরামর্শটি দেরী-বাউন্ডের ক্ষেত্রে কার্যকর হবে না যা কার্যকর করার জন্য তাদের কল করার কোনও জ্ঞান রাখে না।
beanmf

9

কনফিগারেশন ফাইলগুলি অ্যাপ্লিকেশন-স্কোপযুক্ত এবং অ্যাসেম্বলি-স্কোপযুক্ত নয়। সুতরাং আপনার লাইব্রেরিটি ব্যবহার করছে এমন প্রতিটি অ্যাপ্লিকেশনের কনফিগারেশন ফাইলটিতে আপনার গ্রন্থাগারের কনফিগারেশন বিভাগগুলি রাখা দরকার।

এটি বলেছিল যে appSettingsকোনও শ্রেণীর পাঠাগারটিতে অ্যাপ্লিকেশনটির কনফিগারেশন ফাইল, বিশেষত বিভাগটি থেকে কনফিগারেশন নেওয়া ভাল অভ্যাস নয় । আপনার লাইব্রেরির যদি প্যারামিটারগুলির প্রয়োজন হয় তবে তারা সম্ভবত আপনার গ্রন্থাগারকে কল করে যিনি নির্মাণকারী, কারখানার পদ্ধতি ইত্যাদিতে পদ্ধতি আর্গুমেন্ট হিসাবে পাস করতে হবে। এটি ক্লাস লাইব্রেরি দ্বারা প্রত্যাশিত কনফিগারেশন এন্ট্রিগুলি দুর্ঘটনাক্রমে পুনরায় ব্যবহার করা থেকে অ্যাপ্লিকেশনগুলিকে কল করতে বাধা দেয়।

এটি বলেছিল, এক্সএমএল কনফিগারেশন ফাইলগুলি অত্যন্ত কার্যকর, তাই আমি যে সর্বোত্তম সমঝোতা খুঁজে পেয়েছি তা হ'ল কাস্টম কনফিগারেশন বিভাগগুলি ব্যবহার করা। আপনি আপনার লাইব্রেরির কনফিগারেশনটি একটি এক্সএমএল ফাইলে রাখবেন যা স্বয়ংক্রিয়ভাবে ফ্রেমওয়ার্কটি পড়ে এবং পার্স করা হয় এবং আপনি সম্ভাব্য দুর্ঘটনা এড়ান।

আপনি এমএসডিএন- তে কাস্টম কনফিগারেশন বিভাগগুলি সম্পর্কে আরও শিখতে পারেন এবং ফিল হ্যাকের একটি চমৎকার নিবন্ধ রয়েছে।


7
"ক্লাস লাইব্রেরিতে কনফিগারেশন ফাইল থেকে কনফিগারেশন নেওয়া ভাল অভ্যাস নয়" - আমি এর সাথে দৃ strongly়ভাবে একমত নই। উদাহরণস্বরূপ, একটি ডাল শ্রেণির পাঠাগারটি সাধারণত বিএলএল স্তর থেকে এই তথ্যটি পাস করার পরিবর্তে অ্যাপ্লিকেশন কনফিগারেশন ফাইল থেকে সংযোগের স্ট্রিংয়ের মতো কনফিগারেশন ডেটা পাওয়া উচিত। যে কোনও ফ্রেমওয়ার্ক ক্লাস যা কনফিগারেশন ব্যবহার করে (যেমন এএসপি.এনইটি সদস্যতা) এইভাবে কাজ করে।
জো

আমি আমার উত্তরটি কিছুটা সংশোধন করেছি। আমি যা বলেছিলাম তারপরেও আমি দাঁড়িয়ে আছি, তবে আপনি ঠিক বলেছেন, কনফিগারেশন ফাইলগুলি মোটেও ব্যবহার করা উচিত নয় বলে বোঝানোর জন্য আমি কখনই উদ্দেশ্য করি নি। আমি যা বোঝাতে চেয়েছি তা হ'ল, কনভেনশন-ভিত্তিক পরিবর্তিত appSettingsকাস্টম বিভাগগুলি দুর্দান্ত বিকল্প দেয়; এএসপি.এনইটি সদস্যতা সর্বোপরি যা ব্যবহার করে তা অনেক বেশি।
madd0

5
public class ConfigMan
{
    #region Members

    string _assemblyLocation;
    Configuration _configuration;

    #endregion Members

    #region Constructors

    /// <summary>
    /// Loads config file settings for libraries that use assembly.dll.config files
    /// </summary>
    /// <param name="assemblyLocation">The full path or UNC location of the loaded file that contains the manifest.</param>
    public ConfigMan(string assemblyLocation)
    {
        _assemblyLocation = assemblyLocation;
    }

    #endregion Constructors

    #region Properties

    Configuration Configuration
    {
        get
        {
            if (_configuration == null)
            {
                try
                {
                    _configuration = ConfigurationManager.OpenExeConfiguration(_assemblyLocation);
                }
                catch (Exception exception)
                {
                }
            }
            return _configuration;
        }
    }

    #endregion Properties

    #region Methods

    public string GetAppSetting(string key)
    {
        string result = string.Empty;
        if (Configuration != null)
        {
            KeyValueConfigurationElement keyValueConfigurationElement = Configuration.AppSettings.Settings[key];
            if (keyValueConfigurationElement != null)
            {
                string value = keyValueConfigurationElement.Value;
                if (!string.IsNullOrEmpty(value)) result = value;
            }
        }
        return result;
    }

    #endregion Methods
}

কিছু করার জন্য, আমি একটি শ্রেণিতে শীর্ষের উত্তরটি রিফ্যাক্ট করেছি। ব্যবহারটি এমন কিছু:

ConfigMan configMan = new ConfigMan(this.GetType().Assembly.Location);
var setting = configMan.GetAppSetting("AppSettingsKey");

4

আপনি যদি ভিজ্যুয়াল স্টুডিওতে (ক্লাস লাইব্রেরি প্রকল্পে) প্রকল্পের সেটিংস যোগ করেন, তবে এটি আপনার সেটিংসের থেকে সেটিংসের জন্য পূর্বনির্ধারিত মানগুলির সাথে প্রাসঙ্গিক ব্যবহারকারীর সেটিংস / অ্যাপ্লিকেশনস্যাঙ্কটিংস বিভাগগুলি এবং আপনার প্রকল্পে একটি app.config ফাইল যুক্ত করবে project ফাইল।

তবে রানটাইমের সময় এই কনফিগারেশন ফাইলটি ব্যবহার করা হবে না - পরিবর্তে শ্রেণিক পাঠাগারটি তার হোস্টিং অ্যাপ্লিকেশনটির কনফিগারেশন ফাইলটি ব্যবহার করে।

আমি বিশ্বাস করি যে এই ফাইলটি তৈরির মূল কারণটি তাই আপনি হোস্ট অ্যাপ্লিকেশনটির কনফিগারেশন ফাইলটিতে সেটিংস অনুলিপি / পেস্ট করতে পারেন।


4

আমি বর্তমানে একটি খুচরা সফ্টওয়্যার ব্র্যান্ডের জন্য প্লাগইন তৈরি করছি, যা প্রকৃতপক্ষে নেট ক্লাসের লাইব্রেরি। প্রয়োজন হিসাবে, প্রতিটি প্লাগইন একটি কনফিগার ফাইল ব্যবহার করে কনফিগার করা প্রয়োজন। কিছুটা গবেষণা ও পরীক্ষার পরে আমি নিম্নলিখিত ক্লাসটি সংকলন করেছি। এটি নির্বিঘ্নে কাজ করে। দ্রষ্টব্য যে আমি আমার ক্ষেত্রে স্থানীয় ব্যতিক্রম হ্যান্ডলিং প্রয়োগ করি নি কারণ, আমি উচ্চতর স্তরে ব্যতিক্রমগুলি ধরি।

দশমিক এবং দ্বিগুণ ক্ষেত্রে ডেসিমাল পয়েন্টটি সঠিকভাবে পেতে কিছু টুইটের প্রয়োজন হতে পারে, তবে এটি আমার সংস্কৃতিআইফোনটির পক্ষে ঠিক কাজ করে ...

static class Settings
{
    static UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
    static Configuration myDllConfig = ConfigurationManager.OpenExeConfiguration(uri.Path);
    static AppSettingsSection AppSettings = (AppSettingsSection)myDllConfig.GetSection("appSettings");
    static NumberFormatInfo nfi = new NumberFormatInfo() 
    { 
        NumberGroupSeparator = "", 
        CurrencyDecimalSeparator = "." 
    };

    public static T Setting<T>(string name)
    {
        return (T)Convert.ChangeType(AppSettings.Settings[name].Value, typeof(T), nfi);
    }
}

App.Config ফাইলের নমুনা

<add key="Enabled" value="true" />
<add key="ExportPath" value="c:\" />
<add key="Seconds" value="25" />
<add key="Ratio" value="0.14" />

ব্যবহার:

  somebooleanvar = Settings.Setting<bool>("Enabled");
  somestringlvar = Settings.Setting<string>("ExportPath");
  someintvar =     Settings.Setting<int>("Seconds");
  somedoublevar =  Settings.Setting<double>("Ratio");

শ্যাডো উইজার্ড এবং ম্যাটসিকে ক্রেডিট


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। খুব কমপ্যাক্ট এবং "বাক্সের ঠিক বাইরে কাজ করে"। ভাল জিনিস
nirler

2

মূল প্রশ্নের উত্তরে আমি সাধারণত আমার পরীক্ষার প্রকল্পে একটি লিঙ্ক হিসাবে কনফিগার ফাইল যুক্ত করি; তারপরে আপনি পরীক্ষার রান আউট ফোল্ডারে যোগ করার জন্য ডিপোরিয়মেন্ট আইটেম বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

[TestClass]
[DeploymentItem("MyProject.Cache.dll.config")]
public class CacheTest
{
    .
    .
    .
    .
}

সমাবেশগুলি প্রকল্প নির্দিষ্ট হতে পারে না এমন মন্তব্যের জবাবে তারা তা করতে পারে এবং এটি দুর্দান্ত নমনীয়তা সরবরাহ করে। আইওসি ফ্রেমওয়ার্কের সাথে কাজ করার সময়।


2

আমি একই সমস্যার মুখোমুখি হয়েছি এবং Parametersপ্রকল্পটিতে অ্যাপ্লিকেশন কনফিগারেশন ফাইল যুক্ত করার পরে একটি স্ট্যাটিক ক্লাস তৈরি করে সমাধান করেছি :

public static class Parameters
{
    // For a Web Application
    public static string PathConfig { get; private set; } =
        Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "web.config");

    // For a Class Library
    public static string PathConfig { get; private set; } =
        Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", "LibraryName.dll.config");

    public static string GetParameter(string paramName)
    {
        string paramValue = string.Empty;

        using (Stream stream = File.OpenRead(PathConfig))
        {
            XDocument xdoc = XDocument.Load(stream);

            XElement element = xdoc.Element("configuration").Element("appSettings").Elements().First(a => a.Attribute("key").Value == paramName);
            paramValue = element.Attribute("value").Value;
        }

        return paramValue;
    }
}

তারপরে এটির মতো একটি প্যারামিটার পান:

Parameters.GetParameter("keyName");

1
উজ্জ্বল! এটি আমার উইন্ডোজ অ্যাপ্লিকেশন ড্রাইভারকে লক্ষ্য মেশিনে চালিত স্বয়ংক্রিয় পরীক্ষাগুলি পেতে সহায়তা করেছে। আমার ক্ষেত্রে dlls একটি পরীক্ষা প্রকল্প থেকে ছিল। কেবলমাত্র আমি যুক্ত করব উইন অ্যাপ ড্রাইভার (এবং সম্ভবত স্বয়ংক্রিয় পরীক্ষার অন্যান্য রূপ), বেসডাইরেক্টরি আসলে আউটপুট ফোল্ডার যা প্রতিবার পরিবর্তিত হয়। আমাকে এই জাতীয় সাবস্ট্রিং করতে হয়েছিল ... অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডিটারি.সুবস্ট্রিং (0, অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডাইরেক্টরি.আইডেক্সঅফ ("টেস্টারসাল্টস"))। আমার কনফিগারেশন ফাইলটি যেমন আমার টেস্ট ডলসের মতো একই ফোল্ডারে ছিল তেমন আমি অযাচিত আউটপুট ফোল্ডারটি কেটে ফেলতে পারি।
ইওয়ান

1

অ্যাসেমব্লির নিজস্ব app.config ফাইল নেই। তারা যে অ্যাপ্লিকেশনটি ব্যবহার করছে তার অ্যাপ্লিকেশন কোডক্যাগ ফাইলটি ব্যবহার করে। সুতরাং যদি আপনার সমাবেশটি কনফিগার ফাইলে কিছু জিনিস প্রত্যাশা করে, তবে কেবল নিশ্চিত হয়ে নিন যে আপনার অ্যাপ্লিকেশনটির কনফিগার ফাইলটিতে সেগুলি রয়েছে।

যদি আপনার সমাবেশটি একাধিক অ্যাপ্লিকেশন ব্যবহার করে চলেছে তবে সেই অ্যাপ্লিকেশনগুলির প্রত্যেকেরই তাদের অ্যাপ্লিকেশন .c

আমি আপনাকে যা করার পরামর্শ দিচ্ছি তা হ'ল উদাহরণস্বরূপ সেই মানগুলির জন্য আপনার সমাবেশের ক্লাসগুলির বৈশিষ্ট্যগুলি সংজ্ঞায়িত করা

private string ExternalServicesUrl
{
  get
  {
    string externalServiceUrl = ConfigurationManager.AppSettings["ExternalServicesUrl"];
    if (String.IsNullOrEmpty(externalServiceUrl))
      throw new MissingConfigFileAppSettings("The Config file is missing the appSettings entry for: ExternalServicesUrl");
    return externalServiceUrl;
  }
}

এখানে, সম্পত্তি এক্সটার্নাল সার্ভিসস ইউআরএলটির অ্যাপ্লিকেশনটির কনফিগার ফাইল থেকে এর মান পাওয়া যায়। যদি এই অ্যাসেম্বলিটি ব্যবহার করে এমন কোনও অ্যাপ্লিকেশন যদি কনফিগারেশ ফাইলটিতে সেটিংটি অনুপস্থিত থাকে তবে আপনি একটি ব্যতিক্রম পাবেন that এটি স্পষ্ট যে কিছু অনুপস্থিত।

মিসিংকনফিগফিল অ্যাপ্লিকেশনগুলি একটি কাস্টম ব্যতিক্রম। আপনি অন্য একটি ব্যতিক্রম নিক্ষেপ করতে চাইতে পারেন।

অবশ্যই সেই ক্লাসগুলির পদ্ধতির জন্য কনফিগার ফাইল সেটিংয়ের উপর নির্ভর করার পরিবর্তে প্যারামিটার হিসাবে সেই মানগুলি সরবরাহ করার পদ্ধতিটি আরও ভাল হবে। এই ক্লাসগুলি ব্যবহার করে অ্যাপ্লিকেশনগুলি সিদ্ধান্ত নিতে পারে যে তারা কোথায় এবং কীভাবে এই মানগুলি সরবরাহ করে।


উপরের দিকে সাবধান করুন: আপনার .NET সমাবেশ ডিএলএল-এ এক্স ইউনাইট পরীক্ষা চালানোর সময়, এক্স ইউনাইট রানটাইমটিতে লাইব্রেরির। কনফিগ পড়বে। এবং এটি পরীক্ষা বা ডিএলএল প্রকল্পে যুক্ত হওয়া কোনও অ্যাপকনফাইগকে এড়িয়ে যাবে।
জেক 2

1

বিদ্যমান আইটেম যুক্ত ব্যবহার করুন, dll প্রকল্প থেকে অ্যাপ কনফিগারেশন নির্বাচন করুন। অ্যাড ক্লিক করার আগে অ্যাড বোতামের ডানদিকে সামান্য ডাউন তীরটি "লিঙ্ক হিসাবে যুক্ত করুন" ব্যবহার করুন

আমি আমার দেব এ সব সময় না।


1

উপস্থাপিকা : আমি নেট 2.0 ব্যবহার করছি;

ইয়িয়ানিস লিউসিস পোস্ট করা সমাধানটি গ্রহণযোগ্য তবে এটিতে আমার কিছুটা সমস্যা ছিল।

প্রথমত, static AppSettingsSection AppSettings = (AppSettingsSection)myDllConfig.GetSection("appSettings");রিটার্নগুলি শূন্য হয়। আমাকে এটিতে পরিবর্তন করতে হয়েছিলstatic AppSettingSection = myDllConfig.AppSettings;

তারপরে return (T)Convert.ChangeType(AppSettings.Settings[name].Value, typeof(T), nfi);ব্যতিক্রমগুলির জন্য একটি ক্যাচ নেই। সুতরাং আমি এটি পরিবর্তন করেছি

try
{
    return (T)Convert.ChangeType(AppSettings.Settings[name].Value, typeof(T), nfi);
}
catch (Exception ex)
{
    return default(T);
}

এটি খুব ভালভাবে কাজ করে তবে আপনার যদি আলাদা ডিএল থাকে তবে প্রতিবারের জন্য প্রতিটি কোড কোড লিখতে হবে re সুতরাং, প্রতিটি ক্লাসের আপনার প্রয়োজনমতো ইনস্ট্যান্ট করার জন্য এটি আমার সংস্করণ।

public class Settings
{
    private AppSettingsSection _appSettings;
    private NumberFormatInfo _nfi;

    public Settings(Assembly currentAssembly)
    {
        UriBuilder uri = new UriBuilder(currentAssembly.CodeBase);
        string configPath = Uri.UnescapeDataString(uri.Path);
        Configuration myDllConfig = ConfigurationManager.OpenExeConfiguration(configPath);
        _appSettings = myDllConfig.AppSettings;
        _nfi = new NumberFormatInfo() 
        { 
            NumberGroupSeparator = "", 
            CurrencyDecimalSeparator = "." 
        };
    }


    public T Setting<T>(string name)
    {
        try
        {
            return (T)Convert.ChangeType(_appSettings.Settings[name].Value, typeof(T), _nfi);
        }
        catch (Exception ex)
        {
            return default(T);
        }
    }
}

একটি কনফিগার জন্য:

<add key="Enabled" value="true" />
<add key="ExportPath" value="c:\" />
<add key="Seconds" value="25" />
<add key="Ratio" value="0.14" />

এটি হিসাবে ব্যবহার করুন:

Settings _setting = new Settings(Assembly.GetExecutingAssembly());

somebooleanvar = _settings.Setting<bool>("Enabled");
somestringlvar = _settings.Setting<string>("ExportPath");
someintvar =     _settings.Setting<int>("Seconds");
somedoublevar =  _settings.Setting<double>("Ratio");

দয়া করে মুছে ফেলার জন্য ভোটটি পর্যালোচনা করুন। আমার ভুলটি লেখার সময় উত্তরটি প্রেরণ করা হয়েছিল।
মাত্তেও গাগিয়ানো

0

আমি যতদূর সচেতন, আপনার লাইব্রেরি থেকে আপনি যে বিভাগগুলি চান তা + কপি করতে হবে con অ্যাপ্লিকেশনগুলিতে কনফিগ। কনফিগ ফাইল। এক্সিকিউটেবল ইভেন্ট হিসাবে আপনি কেবল 1 টি অ্যাপকনফিগ পান।


আপনি যদি কাস্টম কনফিগার বিভাগগুলি ব্যবহার করছেন তবে আপনি কনফিগার সোর্স বৈশিষ্ট্যটি ব্যবহার করতে পারেন: <মাইক্রেশন কনফিগারসোর্স = "mysection.config" /> এবং কনফিগার ফাইলটি কেবলমাত্র
dll- র

আমি ফাংশন সম্পর্কে সর্বদা একটি ফাঁকা স্ট্রিং এবং মেইল ​​সার্ভার সেটিংস> stackoverflow.com/questions/25123544/… এবং> স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 25138788/… ফিরিয়ে দেওয়ার বিষয়ে জিজ্ঞাসা করা হিসাবে নতুন প্রশ্ন যুক্ত করেছি তাই আমি আশা করি যে কেউ তাদের উত্তর আমার হিসাবে দিয়েছে আমি প্রায় ডিএলএলগুলিতে মানগুলি হার্ডকোডিংয়ের ধারে!
MonkeyMagix

0

কেন ব্যবহার করবেন না:

  • [ProjectNamespace].Properties.Settings.Default.[KeyProperty] সি # এর জন্য
  • My.Settings.[KeyProperty] ভিবি.এনইটি-র জন্য

ডিজাইনের সময় আপনাকে কেবল সেই বৈশিষ্ট্যগুলি আপডেট করতে হবে:

[Solution Project]->Properties->Settings


এটি স্বয়ংক্রিয়ভাবে dll এর জন্য একটি কনফিগার ফাইল তৈরি করবে। তবে আপনি রানটাইমে কনফিগার ফাইল থেকে পরিবর্তিত মানগুলি পড়তে পারবেন না। শেষ পর্যন্ত এটি আপনার কলিং অ্যাপ্লিকেশনটির মানগুলি দেখায়। এছাড়াও জো জো উত্তর দেখুন
কোড পোপ

যদি এটি ব্যবহারকারীর কনফিগারেশনের জন্য কনফিগার করা থাকে তবে তা নয়। ধারণাটি হ'ল ব্যবহারকারীর যা প্রয়োজন তা সম্পাদনা করা, রানটাইম এগুলি কনফিগার করা এবং তারপরে সেভ করা। তারপরে, যখন ব্যবহারকারী লাইব্রেরির সাথে কাজ করে, এটি তার কনফিগারেশনটি লোড করে, এটি তার নিজস্ব ব্যবহারকারীর পাথে সংরক্ষণ করা হয়, তবে কেবল তার জন্য কাজ করে।
পেড্রো মোরা

0

কনফিগারেশন থেকে ব্যবহার এর মতো খুব সহজ হতে হবে:

var config = new MiniConfig("setting.conf");

config.AddOrUpdate("port", "1580");

if (config.TryGet("port", out int port)) // if config exist
{
    Console.Write(port);
}

আরও তথ্যের জন্য MiniConfig দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.