1

状態のドキュメント:ConfigurationManager.OpenExeConfiguration(string exePath)

指定されたクライアント構成ファイルを構成オブジェクトとして開きます。

また、exePath「実行可能(exe)ファイルのパス」であると述べています

このメソッドは*.exe.config、 で指定されたパスにある実行可能ファイルのファイルを開くことになっており、「構成ファイルを読み込めませんでした」場合exePathは aConfigurationErrorsExceptionがスローされます。

次のコードは非実行可能ファイルのパスを使用しており、そのパスのディレクトリには *.exe.config ファイルが含まれていません。それでも、コードは例外なく実行され、無効な引数の他の兆候もありません。

var configs = Directory.GetFiles("C:\\NoConfig", "*.config");
Debug.Assert(configs.Length == 0);
File.WriteAllText("C:\\NoConfig\\notes.txt", "This is not an executable, and there is no .config file in its folder.");
var config = ConfigurationManager.OpenExeConfiguration("c:\\notes.txt");
Debug.Assert(config != null);

ただし、新しい .NET Core JSON ベースの構成では徐々に非推奨になり、レビューも修正もされません。

では、これはこのOpenExeConfigurationメソッドのオーバーロードのバグによるものですか?

MS Connect で提起する前に、セカンドオピニオンとn番目のオピニオンが欲しかっただけです。Connect は現在ダウンしています。

追加:有効なファイルを使用して、実際の実行可能ファイル (テスト済み)を呼び出すOpenExeConfigurationと、ファイルは読み取られますが、解析されません。この回答の回避策を使用して、セクションのxmlをリクエストし、自分で解析する必要があります カスタムファイルからのAppSettings。これは、このコードがこのモードで一般的に使用されておらず、動作するものとして受け入れられ、レビューされていないため、バグがある可能性があるという私の疑念を助長します.exePath.configappSettings

新しい .NET Core 構成 API が古い XML のみを置き換えることで、ほとんど注目されなくなると確信しています。

4

2 に答える 2

2

私が理解しているように、あなたには2つの懸念があります。

  1. 「exe」以外の拡張子を持つファイルの場合、OpenExeConfiguration は失敗しません。

  2. 構成ファイルがまだ存在しない場合、OpenExeConfiguration は失敗しません。

私は両方の点を理解していますが、どちらも議論の余地があると思います.

  1. 実行可能ファイルとは、必ずしも拡張子が .exe のファイルを意味するわけではありません。はい、Windows では通常そうですが、Linux を例に取りましょう (.NET は Windows だけに制限されていないため、これを行うことができます)。実行可能な .NET ファイルに任意の拡張子 (notes.txt も含む) を付けても、拡張子を付けなくてもかまいません。そのファイルを「mono notes.txt」で問題なく実行でき、通常どおり実行されます。

  2. 構成ファイルが存在しないことは、Configurationオブジェクトの例外的な条件ではありません。HasFileそのファイルが存在するかどうかを示すという名前のプロパティもあります。あなたのコードで次のことができます:

    var config = ConfigurationManager.OpenExeConfiguration("c:\\notes.txt"); 
    // config.HasFile == false here
    config.AppSettings.Settings.Add("test", "test");
    config.Save(ConfigurationSaveMode.Full, true);
    // config.HasFile == true here, and file is written to disk
    
于 2016-10-08T17:10:23.313 に答える
0

バグと呼べるかどうかは定かではありませんが、

この参照に従って

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9によると 、パラメーターはexeの場所であり、メソッドは構成を探しますそのexeに対応します(exePathのパラメーター名は今では意味があると思います!)。

また、回避策も提供します-

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
于 2016-10-08T12:26:44.093 に答える