كيف يمكنني تحديد ملف تكوين تطبيق .NET من معلمة سطر الأوامر؟

StackOverflow https://stackoverflow.com/questions/163803

سؤال

أرغب في تجاوز استخدام app.config القياسي عن طريق تمرير معلمة سطر الأوامر. كيف يمكنني تغيير ملف تكوين التطبيق الافتراضي بحيث عند الوصول إلى ConfigurationManager.AppSettings ، أقوم بالوصول إلى ملف التكوين المحدد في سطر الأوامر؟

يحرر:

اتضح أن الطريقة الصحيحة لتحميل ملف التكوين الذي يختلف عن اسم exe plus .config هو استخدام OpenMappedExeconFiguration. على سبيل المثال

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Shell2.exe.config");
currentConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

هذا يعمل جزئيا. أستطيع أن أرى جميع المفاتيح في قسم Appsettings ولكن جميع القيم لاغية.

هل كانت مفيدة؟

المحلول

لذا ، إليك الرمز الذي يسمح لي فعليًا بالوصول فعليًا إلى قسم AppSettings في ملف التكوين بخلاف الفصل الافتراضي.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Alternate.config");
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
string MySetting = section.Settings["MySetting"].Value;

نصائح أخرى

ملف الدُفعات الذي ينسخ ملف التكوين المطلوب إلى appname.exe.config ثم يقوم بتشغيل appname.exe.

كنت بحاجة إلى القيام بذلك لتطبيق لي أيضًا ، والتعامل مع كائنات التكوين القياسية تحولت إلى مثل هذا المتاعب المثيرة لمثل هذا المفهوم البسيط الذي ذهبت إليه في هذا الطريق:

  1. احتفظ بملفات التكوين المتعددة بتنسيق XML مشابه لـ App.Config
  2. قم بتحميل ملف التكوين المحدد في مجموعة البيانات (عبر .readxml) ، واستخدم جدول البيانات مع معلومات التكوين فيه كـ كائن التكوين.
  3. لذلك كل رمز الخاص بي يتعامل فقط مع التكوين DataTable لاسترداد القيم وليس هذا كائن تكوين التطبيق المحبب.

ثم يمكنني المرور في أي اسم ملف التكوين الذي أحتاجه على سطر الأوامر وإذا لم يكن هناك - فقط قم بتحميل App.Config في مجموعة البيانات.

Jeezus كان أبسط بكثير بعد ذلك. :-)

رون

هذا هو الجزء ذي الصلة من المصدر للتطبيق الذي يستخدم التكوين الافتراضي ويقبل التجاوز عبر سطر الأوامر:

احصل على تكوين حالي أو مستخدم في كائن التكوين

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
string defCfgName = Environment.GetCommandLineArgs()[0] + ".config";

if (arg.Length != 0)
{
    string ConfigFileName = arg[0];
    if (!File.Exists(ConfigFileName))
        Fatal("File doesn't exist: " + ConfigFileName, -1);                
    config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = ConfigFileName }, ConfigurationUserLevel.None);
}
else if (!File.Exists(defCfgName)) Fatal("Default configuration file doesn't exist and no override is set." , -1);

استخدم كائن التكوين

AppSettingsSection s = (AppSettingsSection)config.GetSection("appSettings");
KeyValueConfigurationCollection a = s.Settings;
ConnectionString = a["ConnectionString"].Value;

هذا ليس بالضبط ما تريده ... لإعادة توجيه الفعلي ConfigurationManager كائن ثابت لتشير إلى مسار مختلف. لكنني أعتقد أنه الحل الصحيح لمشكلتك. تفحص ال OpenExeConfiguration طريقة على ConfigurationManager صف دراسي.

إذا لم تكن الطريقة أعلاه هي ما تبحث عنه ، فأعتقد أنه سيكون من المفيد أيضًا إلقاء نظرة على استخدام قدرات التكوين من إطار مكتبة المؤسسة (تم تطويره وصيانته من قبل فريق Microsoft أنماط وممارسات).

على وجه التحديد إلقاء نظرة على FileConfigurationSource صف دراسي.

فيما يلي بعض التعليمات البرمجية التي تبرز استخدام FileConfigurationSource من مكتبة المؤسسة, ، أعتقد أن هذا يحقق أهدافك بالكامل. التجميع الوحيد الذي تحتاجه من ent lib لهذا هو Microsoft.Practices.EnterpriseLibrary.Common.dll.

static void Main(string[] args)
{
    //read from current app.config as default
    AppSettingsSection ass = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings;

    //if args[0] is a valid file path assume it's a config for this example and attempt to load
    if (args.Length > 0 && File.Exists(args[0]))
    {
        //using FileConfigurationSource from Enterprise Library
        FileConfigurationSource fcs = new FileConfigurationSource(args[0]);
        ass = (AppSettingsSection) fcs.GetSection("appSettings");
    }

    //print value from configuration
    Console.WriteLine(ass.Settings["test"].Value);
    Console.ReadLine(); //pause
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top