16


3

コマンドラインパラメータを渡して、標準の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です。

5 Answer


14


だからここに私が実際に私が実際にデフォルト以外の設定ファイルのappSettingsセクションにアクセスすることを可能にするコードがあります。

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory、 "Alternate.config");構成設定= ConfigurationManager.OpenMappedExeConfiguration(configFile、ConfigurationUserLevel.None);

AppSettingsSectionセクション=(AppSettingsSection)config.GetSection( "appSettings");文字列MySetting = section.Settings ["MySetting"]。値。


3


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


1


私は私のアプリでもこれを行う必要がありました、そして標準のconfigオブジェクトを扱うことは私がこのルートをたどったというそのような単純な概念のためのそのようなおかしい面倒になりました:

  1. app.configに似たXMLフォーマットで複数の設定ファイルを保存する

  2. 指定された設定ファイルを(.ReadXML経由で)* DataSet にロードし、その中の設定情報を含む DataTable *をmy * Configuration object *として使用します。

  3. だから私のすべてのコードは値を取得するために* Configuration DataTable *を扱うだけで、その巧妙に難読化されたapp configオブジェクトではありません。

その後、必要な設定ファイル名をコマンドラインで渡すことができます。それがない場合は、* DataSet *にapp.configをロードするだけです。

Jeezusそれ以降はずっと簡単でした。 :-)

ロン


1


これは、デフォルト設定を使用し、コマンドラインを介して上書きを受け入れるappのソースの関連部分です。

現在の設定またはユーザ設定をConfigオブジェクトに入れる

構成設定= ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); string defCfgName = Environment.GetCommandLineArgs()[0] ".config";

if(arg.Length!= 0){文字列ConfigFileName = arg [0]; if(!File.Exists(ConfigFileName))致命的( "ファイルが存在しません:" ConfigFileName、-1); config = ConfigurationManager.OpenMappedExeConfiguration(新しいExeConfigurationFileMap {ExeConfigFilename = ConfigFileName}、ConfigurationUserLevel.None);そうでなければ(!File.Exists(defCfgName))致命的( "デフォルトの設定ファイルは存在せず、上書きも設定されていません。"、-1)。

設定オブジェクトを使う

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


0


これはまさにあなたが望んでいるものではありません…​ 実際のhttp://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx [ConfigurationManager]静的オブジェクトを別のパスを指すようにリダイレクトする。 しかし、私はそれがあなたの問題に対する正しい解決策だと思います。 http://msdn.microsoft.com/en-us/library/system.configurationのhttp://msdn.microsoft.com/en-us/library/ms224437.aspx [OpenExeConfiguration]メソッドをチェックしてください。 configurationmanager.aspx [ConfigurationManager]クラス。

上記の方法があなたが探しているものではないならば、私はそれもhttp://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.common.configurationを使うのを見てみる価値があると思います。 Enterprise Libraryフレームワークのaspx [構成機能](Microsoft Patternsによって開発および管理されています)

具体的には、http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.common.configuration.fileconfigurationsource.fileconfigurationsource.aspx [FileConfigurationSource]クラスを見てください。

http://www.microsoft.com/downloads/details.aspx?familyid=90DE37E0-7B42-4044-99BE-F8ECFBBC5B65からの `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
}