web-dev-qa-db-ja.com

アクティブなapp.configファイルのパスを見つける方法

私はこの例外ハンドラを終了しようとしています:

if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
    string pathOfActiveConfigFile = ...?
    throw new ConfigurationErrorsException(
       "You either forgot to set the connection string, or " +
       "you're using a unit test framework that looks for  "+
       "the config file in strange places, update this file : " 
       + pathOfActiveConfigFile);
}

この問題は、nUnitを使用している場合にのみ発生するようです。

161
MatthewMartin

これを試して

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

それが役に立てば幸い

349
Cédric Rup

厳密に言えば、単一の構成ファイルはありません。 ASP.NETを除外する1 組み込み(System.Configuration)サポートを使用する3つの構成ファイルが存在する場合があります。マシン構成に加えて:app.exe.config、ユーザーローミング、およびユーザーローカル。

「グローバル」構成(exe。config)を取得するには:

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

使用ごとのローミング設定ファイルと非ローミング設定ファイルには、異なる ConfigurationUserLevel 値を使用します。


1 子フォルダー(IIS仮想またはファイルシステム)web.configのコンテンツが(設定に応じて)親のweb.configに追加またはオーバーライドできる完全に異なるモデルを持っています。

61
Richard

NUnitを使用するときにnullリターンのみを取得する場合は、おそらくConnectionString値をアプリケーションのapp.configからテストライブラリのapp.configにコピーする必要があります。

テストローダーによって実行されると、実行時にテストアセンブリが読み込まれ、アプリケーションの構成ファイルではなく、独自のapp.config(コンパイル時にtestAssembly.dll.configに名前が変更されます)が検索されます。

実行しているアセンブリの場所を取得するには、試してください

System.Reflection.Assembly.GetExecutingAssembly().Location
9
Colin Desmond

ファイルのプロパティをクリックし、「常にコピー」に設定することを確認してください。そうしないと、必要な場所を設定してカウベルを追加するために、幸せなlil DLLのDebug \フォルダーにありません

6
Chad Grant

ユニットテストプロジェクトが、本番コードプロジェクト(もちろんDOH)に関連付けられたapp.configではなく、そのプロジェクトのapp.configを参照していることに初めて気づいたとき、Prodプロジェクトのポストビルドイベントに行を追加しました。 app.configがテストプロジェクトのbinフォルダーにコピーされます。

問題が解決しました

私はこれまで奇妙な副作用に気づいていませんが、これが正しい解決策であるかどうかはわかりませんが、少なくともうまくいくようです。

6
Kasper

私が見たもう1つのオプションがここにありません:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
4
selalerer

構成ファイルの場所によっては、System.Reflection.Assembly.GetExecutingAssembly().Locationが必要なことを行う場合があります。

3

Webアプリ(実際にはローカルで実行されるAzure Webロール)で以前の回答の1つを試しましたが、うまくいきませんでした。ただし、この同様のアプローチは機能しました。

var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" };
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath;

構成ファイルはC:\ Program Files\IIS Express\MyComponent.dll.configにあることが判明しました。それのための興味深い場所。

3
RedGreenCode