সি # ডিএলএল কনফিগারেশন ফাইল


191

আমি আমার ডিএলএলে একটি app.config ফাইল যুক্ত করার চেষ্টা করছি, তবে সমস্ত প্রচেষ্টা ব্যর্থ হয়েছে।

' একটি ডিএলএলে কনফিগারেশন তথ্য রাখার ক্ষেত্রে' মিউজিক জেনেসিসের মতে এটি কোনও সমস্যা হওয়া উচিত নয়। স্পষ্টতই আমি কিছু ভুল করছি ...

নিম্নলিখিত কোডটি আমার ডিএলএল থেকে আমার কানেকশনস্ট্রিংটি ফিরিয়ে আনবে:

return ConfigurationManager.AppSettings["ConnectionString"];

যাইহোক, আমি যখন আমার কনসোল অ্যাপ্লিকেশনটিতে app.config ফাইলটি অনুলিপি করি তখন এটি ঠিকঠাক কাজ করে।

কোন ধারনা?


উল্লিখিত পোস্ট অনুসারে: যদি dll এর নাম MyDll.dll হয়, তবে কনফিগার ফাইলটি MyDLL.dll.config হওয়া উচিত। আপনি যদি dll থেকে কনফিগারেশন সেটিংসটি পড়ে থাকেন তবে এটির নিজস্ব কনফিগারেশনটি সঠিকভাবে উল্লেখ করা উচিত?
মেগাবাইট

11
কোড কী জিজ্ঞাসা করে তা বিবেচ্য নয়
মার্ক গ্রাভেল

একটি দ্রষ্টব্য: "ডিএলএলে কনফিগারেশন তথ্য রাখার" প্রশ্নটি আপনার অ্যাপ্লিকেশনটির কনফিগারেশন কোডটিকে মূল অ্যাপ্লিকেশন কোড থেকে পৃথক রাখতে একটি লাইব্রেরিতে আলাদা করার বিষয়ে। এটি একটি কনফিগারেশন ফাইলের থেকে পৃথক এবং নিজস্ব কোনও ডিএলএল জন্য বিশেষ।
ক্রিস আম্মারম্যান

এই পোস্টটিকে দেখতে পারবেন [1] [লিঙ্ক এখানে বর্ণনা লিখুন], আমার জন্য সমাধান ছিল [1]: stackoverflow.com/questions/2389290/...
dhailis

এই পোস্টটিকে দেখতে পারবেন [কীভাবে একটি পৃথক অ্যাপ্লিকেশন সেটিংস বর্তমান সেটিংসে পরিবর্তনশীল এবং একত্রীকরণ ফাইল লোড করতে?] [1] helpfu হতে পারে [1]: stackoverflow.com/questions/2389290/...
dhailis

উত্তর:


277

.DLL এর জন্য .NET কনফিগারেশন ফাইল তৈরি করা তাত্পর্যপূর্ণ নয় এবং সঙ্গত কারণে। অ্যাপটিকে সহজেই আপগ্রেড / আপডেট করার সুবিধার্থে এবং ইনস্টলড অ্যাপ্লিকেশনগুলিকে একে অপরের কনফিগারেশন ফাইলকে পদদলিত করা থেকে রক্ষা করার জন্য .NET কনফিগারেশন ব্যবস্থার অনেকগুলি বৈশিষ্ট্য রয়েছে।

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

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

অ্যাপ ডোমেনটি মূল কোডটিতে আবদ্ধ হয় যা আপনার কোডটি আসলে যে সমাবেশটি লোড করে most বেশিরভাগ ক্ষেত্রে এটি আপনার মূল। কোনও অ্যাপ্লিকেশনটির মধ্যে অন্যান্য অ্যাপ্লিকেশন ডোমেনগুলি স্পিন করা সম্ভব তবে সেই অ্যাপ্লিকেশন ডোমেনের মূল সমাবেশটি আপনাকে স্পষ্টভাবে তথ্য সরবরাহ করতে হবে।

এই সমস্ত কারণে, একটি লাইব্রেরি-নির্দিষ্ট কনফিগার ফাইল তৈরি করার পদ্ধতি এতটা সুবিধাজনক নয়। এটি একই প্রক্রিয়া যা আপনি কোনও বিশেষ সমাবেশের সাথে আবদ্ধ না হয়ে একটি স্বচ্ছ পোর্টেবল কনফিগারেশন ফাইল তৈরি করতে ব্যবহার করবেন তবে আপনি যার জন্য .NET এর এক্সএমএল স্কিমা, কনফিগার বিভাগ এবং কনফিগার উপাদান উপাদানগুলি ইত্যাদির ব্যবহার করতে চান এটিতে কোনও ExeConfigurationFileMapবস্তু তৈরির প্রয়োজন রয়েছে কনফিগার ফাইলটি কোথায় সংরক্ষণ করা হবে তা সনাক্ত করতে এবং তারপরে কল করার জন্য ডেটা লোড করা হচ্ছে ConfigurationManagerOpenMappedExeConfigurationএটি একটি নতুন Configurationউদাহরণে খুলতে । এটি আপনাকে স্বয়ংক্রিয় পথ উত্পাদনের প্রক্রিয়া দ্বারা সরবরাহিত সংস্করণ সুরক্ষা থেকে বিচ্ছিন্ন করবে

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

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

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


আমি মনে করি যে সিঙ্ক প্রক্রিয়াটি একটি "নামযুক্ত ইভেন্ট" ইত্যাদি হওয়া উচিত, কারণ এটি
জ্যাকব

8
: / মেহ আমাদের হ'ল একটি দৈত্য এন্টারপ্রাইজ অ্যাপ্লিকেশন / মূল .এক্সে বিভিন্ন টাইমজোন এবং বিভিন্ন ডিএলএল দ্বারা উপস্থাপিত মডিউলগুলি এবং একটি কাস্টম প্লাগইন ফ্রেমওয়ার্কের মাধ্যমে গতিশীলভাবে আবদ্ধ ময়ূলে লেখা e এই সমস্ত "আপনার একাধিক অ্যাপ্লিকেশনগুলি আপনার ডিএলএল একই সাথে ব্যবহার করতে পারে তা নিশ্চিত করতে হবে" আড়ম্বরটি ঠিক ভুল।
জনএল 4

তদুপরি, আমার কেরিয়ারের একটি বড় অংশে, আমি এই সুন্দর জেনেরিক শেয়ারড-অবজেক্ট প্রক্রিয়াগুলি সম্পূর্ণ উপেক্ষা করে দেখেছি, দলগুলি ডিএলএল (বা জেআর) তৈরি করছে যা কেবলমাত্র একটি প্রসঙ্গে ব্যবহার করা যেতে পারে (এবং উপস্থিত থাকতে হবে, বা অ্যাপ্লিকেশন ব্যর্থ হয়েছে) )। তারা পাশাপাশি স্থিতিশীলভাবে আবদ্ধ হতে পারে, কিন্তু এটি পাস।
জনএল 4

1
"পরিসংখ্যানগতভাবে বলতে গেলে, আপনি সম্ভবত এই লাইব্রেরিটি অভ্যন্তরীণ সেটিংয়ে ব্যবহার করছেন এবং কোনও এক মেশিন / ব্যবহারকারীর মধ্যে আপনার একাধিক অ্যাপ্লিকেশন ব্যবহার করার সম্ভাবনা নেই" " তত্ত্ব এবং অনুশীলনের মধ্যে পার্থক্য মাঝে মাঝে আমাকে বেশ খারাপ লাগে।
জনএল 4

1
@ পানজারক্রিসিস, ভিজ্যুয়াল স্টুডিওর সেটিংস.সেটেটিং বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে সমস্ত ব্যবহারকারীর সেটিংসের জন্য সংস্করণ নির্দিষ্ট পাথ তৈরি করে। দেখুন: stackoverflow.com/questions/35778528/...
Deantwo

101

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

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

ভিএস ২০০ System সিস্টেমের জন্য পরিচালিত সি ++ ইন :: কনফিগারেশন :: কনফিগারেশন ^ অ্যাপকনফিগ = কনফিগারেশন ম্যানেজার :: ওপেনএক্সসিফফিগারেশন (এসেম্বলি :: গেটএক্সেকুটিংএ্যাসবেশন () -> অবস্থান); স্ট্রিং ^ নাম = appConfig-> অ্যাপসেটেটিং-> সেটিংস ["নাম"] -> মান;
হ্যানস

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

19

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

পটভূমি: আমি আমার DAL.dll এর ডাটাবেস এবং ডাল সেটিংসের জন্য নিজস্ব কনফিগার ফাইল রাখতে চাই। এন্টারপ্রাইজ লাইব্রেরি এবং এর নিজস্ব কনফিগারেশনের জন্য আমার অ্যাপকনফিগও প্রয়োজন। সুতরাং আমার দুটি অ্যাপ্লিকেশন কনফিগ এবং dll.config দরকার।

আমি যা করতে চাইনি তা হ'ল অ্যাপ থেকে আমার ডাল স্তরটিতে প্রতিটি সম্পত্তি / সেটিংটি পাস-মাধ্যমে!

"অ্যাপডোমাইন.কন্টেনডোমাইন.সেটআপ ইনফরমেশন.কনফিগারেশন ফাইল" বাঁকানো সম্ভব নয় কারণ আমার স্বাভাবিক অ্যাপ্লিকেশন কনফিগ আচরণের জন্য এটি প্রয়োজন।

আমার প্রয়োজনীয়তা / দর্শন পয়েন্টগুলি ছিল:

  • ClassLibrary1.dll.config থেকে উইন্ডোজফোর্ডস অ্যাপ্লিকেশন 1.exe.config- তে কোনও কিছুর ম্যানুয়াল অনুলিপি নেই কারণ এটি অন্যান্য বিকাশকারীদের পক্ষে অপ্রকাশনীয়।
  • শক্তিশালী টাইপিংয়ের ব্যবহার "প্রপার্টিজ.সেটেটিংস.ড্যাফল্ট.নামঅফভ্যালু" (সেটিংস আচরণ) ধরে রাখুন কারণ আমি মনে করি এটি একটি প্রধান বৈশিষ্ট্য এবং আমি এটি হারাতে চাইনি
  • আমি আপনার নিজস্ব / কাস্টম কনফিগারেশন ফাইল বা পরিচালনা ইনজেকশনের জন্য অ্যাপ্লিকেশনসেটিংজেসের অভাব খুঁজে পেয়েছি (সমস্ত প্রয়োজনীয় ক্ষেত্রগুলি এই শ্রেণীর মধ্যে ব্যক্তিগত)
  • "কনফিগার সোর্স" ফাইল পুনর্নির্দেশের ব্যবহার সম্ভব নয় কারণ আমাদের ক্লাসলিবারিয়ান ১.ডিলসিএনফিগ অনুলিপি / পুনর্লিখন করতে হবে এবং বেশ কয়েকটি বিভাগের জন্য বেশ কয়েকটি এক্সএমএল ফাইল সরবরাহ করতে হবে (আমি এটিও পছন্দ করি না)
  • এমএসডিএন পরামর্শ দেয় যেহেতু আমি এই সহজ কাজটির জন্য আমার নিজের সেটিংসপোভাইডারটি লিখতে পছন্দ করি না কারণ আমি ভেবেছিলাম যে কেবল খুব বেশি হবে
  • আমার শুধুমাত্র কনফিগার ফাইল থেকে বিভাগগুলির অ্যাপ্লিকেশনসেটেটিং এবং সংযোগসটিংগুলি দরকার

আমি সেটিংস.সি ফাইলগুলি সংশোধন করে হাজির হয়েছি এবং একটি পদ্ধতি প্রয়োগ করেছি যা ক্লাসলিবারিয়ান 1.dll.config খুলবে এবং একটি ব্যক্তিগত ক্ষেত্রে বিভাগের তথ্য পড়বে। তারপরে, আমি "এই [স্ট্রিং প্রপার্টি নাম" "কে ওভাররিড করে রেখেছি তাই উত্পন্ন সেটিংস gin ডিজাইনার সি। বেস ক্লাসের পরিবর্তে আমার নতুন সম্পত্তিতে কল করে। সেখানে সেটিংটি তালিকার বাইরে পড়ে।

অবশেষে নিম্নলিখিত কোড রয়েছে:

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;
        }
    }

আপনাকে কেবল ক্লাসলিবারিয়ান 1 আউটপুট ডিরেক্টরি থেকে আপনার অ্যাপ্লিকেশনটির আউটপুট ডিরেক্টরিতে আপনার ক্লাসলিবারিয়ান 1.dll.config অনুলিপি করতে হবে। সম্ভবত কেউ এটি দরকারী খুঁজে পাবেন।


14

AppDomainকনফিগারেশন ম্যানেজার ব্যবহার করার সময়, আমি নিশ্চিত যে এটি প্রক্রিয়া / কনফিগারেশন ফাইল (app.config / web.config) লোড করছে । আপনি যদি একটি নির্দিষ্ট কনফিগারেশন ফাইলটি লোড করতে চান, আপনাকে বিশেষ করে নামটি দিয়ে সেই ফাইলটি জিজ্ঞাসা করতে হবে ...

আপনি চেষ্টা করতে পারেন:

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

উল্লিখিত পোস্ট অনুসারে: যদি dll এর নাম MyDll.dll হয়, তবে কনফিগার ফাইলটি MyDLL.dll.config হওয়া উচিত। আপনি যদি dll থেকে কনফিগারেশন সেটিংসটি পড়ে থাকেন তবে এটির নিজস্ব কনফিগারেশনটি সঠিকভাবে উল্লেখ করা উচিত?
মেগাবাইট

1
না ... আমি মনে করি না। "থেকে dll সঙ্গে" কোন প্রতিক্রিয়া তোলে; ডিফল্টরূপে এটি অ্যাপডোমাইন: my.exe.config
মার্ক গ্র্যাভেল

1
বিশেষত, অ্যাপডোমাইন.কন্টেনডোমাইন.সেটআপ ইনফরমেশন. কনফিগারেশনফায়াল সেটিংস।
মার্ক গ্র্যাভেল

দ্রষ্টব্য: আমি ওপেনএক্সে কনফিগারেশনের চেষ্টা করেছি এবং আমিও নিশ্চিত নই যে এটিও কাজ করে। সম্ভবত এই অ্যাপলিকেশনটির সাথে কনফিগারটি মার্জ করবেন?
মার্ক গ্র্যাভেল

এটি করা যেতে পারে ... তবে কোনও EXE এর জন্য app.config ফাইলের মতো একই ধরণের সমর্থন এবং সুরক্ষার সাথে নয়। আমার উত্তর দেখুন।
ক্রিস আম্মারম্যান

13

কনফিগারেশন ম্যানেজআর.অ্যাপসেটিংস অ্যাপ্লিকেশনটির জন্য নির্দিষ্ট সেটিংসটি নির্দিষ্ট ডিএলএল নয়, আপনি সেগুলি অ্যাক্সেস করতে পারবেন তবে এটি অ্যাপ্লিকেশন সেটিংস ফেরত আসবে returns

আপনি যদি অন্য কোনও অ্যাপ্লিকেশন থেকে ডেল ব্যবহার করেন তবে কানেকশনস্ট্রিং অ্যাপ্লিকেশনটির অ্যাপ্লিকেশনগুলির মধ্যে থাকবে।


6

আমি জানি যে এটি পার্টির দেরিতে, তবে আমি ভেবেছিলাম যে আমি ডিএলএল এর জন্য যে সমাধানটি ব্যবহার করি তা ভাগ করে নেব।

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

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


আমি এই পদ্ধতির পাশাপাশি ব্যবহার করি এবং এখন পর্যন্ত এটি যেভাবে কার্যকর হয়েছে তাতে আমি সন্তুষ্ট।
ডেভ

4

আপনি সঠিক, আপনি একটি dll এর কনফিগারেশন ফাইল পড়তে পারেন। আমি একদিনের জন্য এটির সাথে লড়াই করেছি যতক্ষণ না জানা গেল যে আমার কনফিগারেশন ফাইলটি সমস্যা was নীচে আমার কোড দেখুন। এটি চালাতে সক্ষম ছিল।

        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));

"প্যাথ.কোমাইন (এনভায়রনমেন্ট.কন্ট্রনডাইরেক্টরি, এসেম্বলি.গেটএক্সেকিউটিংঅ্যাস্পাব্যাশন ()। ম্যানিফেস্ট মডেল.নাম)" এর পরিবর্তে আপনি "এসেম্বলি.গেট
এক্সেক্সিউটিংঅ্যাস্পাবেশন

3

আপনি যদি ডাব্লুসিএফ-এর মতো পর্দার আড়ালে প্রচুর পরিমাণে কনফিডেশন সন্ধান করে এমন লাইব্রেরি ব্যবহার করে থাকেন তবে আপনি এটি করার কথা বিবেচনা করতে পারেন:

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

বা পাওয়ারশেলের মধ্যে:

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

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

নিম্নলিখিতটি সুপারিশ করা হয় না:
প্রযুক্তিগত কৌতূহল হিসাবে, থিমটিতে এখানে একটি বৈচিত্র রয়েছে। আপনি ডিএলএলে অবস্থিত কোনও শ্রেণীর ভিতরে একটি স্ট্যাটিক কনস্ট্রাক্টর তৈরি করতে পারেন এবং সেখান থেকে এই কল করতে পারেন। আমি সর্বশেষ উপায় হিসাবে বাদে এটি করার সুপারিশ করব না।


3

সম্পূর্ণ সমাধানটি প্রায়শই এক জায়গায় পাওয়া যায় না ...

1) একটি অ্যাপ কনফিগারেশন ফাইল তৈরি করুন এবং এটির নাম দিন "yourDllName.dll.config"
2) ভিএস সলিউশন এক্সপ্লোরারে উপরে তৈরি কনফিগারেশন ফাইলটিতে ডান ক্লিক করুন, বৈশিষ্ট্যগুলি ক্লিক করুন
--- "বিল্ড অ্যাকশন" = সামগ্রী
--- সেট করুন "আউটপুট ডিরেক্টরিতে অনুলিপি করুন" = সর্বদা
3) আপনার কেইনাম এবং আপনার কেভ্যালু দিয়ে কনফিগারেশন ফাইলটিতে (yourDllName.dll.config) একটি অ্যাপসেটিং বিভাগ যুক্ত করুন set

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

৪) সিস্টেমকে যুক্ত করুন your আপনার ডিএল / শ্রেণি / প্রকল্পের রেফারেন্সগুলিতে
কনফিগারেশন 5) আপনার কোডটিতে ব্যবহারের বিবৃতি যুক্ত করুন যেখানে আপনি কনফিগার সেটিংটি অ্যাক্সেস করতে চান

using System.Configuration;
using System.Reflection;

6) মান অ্যাক্সেস করতে

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

7) আনন্দ, এটি কাজ করে

আইএমএইচও, এটি কেবলমাত্র নতুন ডেল / লাইব্রেরি তৈরি করার সময় ব্যবহার করা উচিত।

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

কনফিগারেশন ফাইলটি একটি দুর্দান্ত রেফারেন্স হিসাবে শেষ হয়ে যায়, যখন আপনি আপনার প্রকৃত অ্যাপ্লিকেশনটিতে ডেলের অ্যাপসেটিংগুলি যুক্ত করেন।


3

মনে হচ্ছে এই কনফিগার ফাইলগুলি ডিভ পরিবেশ থেকে স্থাপনার পরিবর্তনে তাদের আচরণ পরিবর্তিত হওয়ায় স্পষ্ট করে দিতে বিভ্রান্ত করছে। স্পষ্টতই একটি ডিএলএল এর নিজস্ব কনফিগার ফাইল থাকতে পারে তবে আপনি একবার dll অনুলিপি করে (তাদের কনফিগার ফাইলের সাথে একসাথে) পেস্ট করলে পুরো জিনিসটি কাজ করা বন্ধ করে দেয়। একমাত্র সমাধান হ'ল ম্যানুয়ালি app.config ফাইলগুলিকে একটি একক ফাইলে একত্রিত করা, যা কেবল এক্সিকিউটর দ্বারা ব্যবহৃত হবে। উদাহরণস্বরূপ, myapp.exe এর মধ্যে একটি myapp.exe.config ফাইল থাকবে যা মাইএপ.এক্সই দ্বারা ব্যবহৃত সমস্ত ডিএলগুলির জন্য সমস্ত সেটিংস ধারণ করে। আমি ভিএস 2008 ব্যবহার করছি।


2

এই সমস্যার ভাল সমাধান বলে মনে হচ্ছে এমনটি আমি খুঁজে পেয়েছি। আমি ভিএস ২০০৮ সি # ব্যবহার করছি। আমার সমাধানটিতে একাধিক কনফিগারেশন ফাইলের মধ্যে স্বতন্ত্র নামস্থান ব্যবহার করা জড়িত। আমি সমাধানটি আমার ব্লগে পোস্ট করেছি: http://tommiecarter.blogspot.com/2011/02/how-to-access-m Multipleple-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

মার্ক যেমন বলেছে, এটি সম্ভব নয় (যদিও ভিজ্যুয়াল স্টুডিও আপনাকে শ্রেণিক পাঠাগার প্রকল্পে একটি অ্যাপ্লিকেশন কনফিগারেশন ফাইল যুক্ত করতে দেয়)।

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


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