16

コマンド ライン パラメーターを渡すことで、標準の app.config の使用をオーバーライドしたいと考えています。ConfigurationManager.AppSettings にアクセスするときに、コマンド ラインで指定された構成ファイルにアクセスするように、デフォルトのアプリケーション構成ファイルを変更するにはどうすればよいですか?

編集:

EXE と .config の名前とは異なる構成ファイルをロードする正しい方法は、OpenMappedExeConfiguration を使用することです。例えば

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

これは部分的に機能します。appSettings セクションですべてのキーを確認できますが、すべての値が null です。

4

5 に答える 5

14

したがって、デフォルト以外の構成ファイルの 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;
于 2008-10-02T19:48:27.420 に答える
3

目的の構成ファイルを appname.exe.config にコピーし、appname.exe を実行するバッチ ファイル。

于 2008-10-02T18:23:01.823 に答える
1

これはまさにあなたが望んでいるものではありません...実際のConfigurationManager静的オブジェクトを別のパスを指すようにリダイレクトします。しかし、それはあなたの問題に対する正しい解決策だと思います。クラスのOpenExeConfigurationメソッドを確認してください。ConfigurationManager

上記の方法が探しているものではない場合は、Enterprise Library フレームワーク (Microsoft Patterns & Practices チームによって開発および管理されている)の構成機能を使用することも検討する価値があると思います。

具体的にはFileConfigurationSourceクラスを見てください。

FileConfigurationSourcefrom Enterprise Libraryの使用を強調するコードを次に示します。これはあなたの目標を完全に満たしていると思います。このために 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
}
于 2008-10-02T18:27:26.587 に答える
1

私のアプリでもこれを行う必要があり、標準の構成オブジェクトを処理することは、このような単純な概念のために非常に面倒になり、次のルートに進みました。

  1. 複数の構成ファイルを app.config と同様の XML 形式で保持する
  2. 指定された構成ファイルを(.ReadXML 経由で) DataSetに読み込み、構成情報を含むDataTableを構成オブジェクトとして使用します。
  3. したがって、私のコードはすべてConfiguration DataTableを処理して値を取得するだけであり、非常に難読化されたアプリ構成オブジェクトではありません。

次に、コマンドラインで必要な構成ファイル名を渡すことができます。存在しない場合は、 app.config をDataSetにロードするだけです。

Jeezus その後はとてもシンプルになりました。:-)

ロン

于 2008-10-02T19:28:11.120 に答える
1

これは、デフォルトの構成を使用し、コマンド ライン経由でオーバーライドを受け入れるアプリのソースの関連部分です。

現在またはユーザーの設定を Config オブジェクトに取得します

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;
于 2009-07-07T11:56:22.767 に答える