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


167

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

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を使用しているときにのみ発生するようです。

回答:


363

これを試して

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

それが役に立てば幸い


これは、Assembly.GetEntryAssembly()+ ".config"を使用しようとするよりもずっと優れています。
Contango 2013年

4
このパスを変更するにはどうすればよいですか?
Vignesh Subramanian

ありがとうございました。VS2008-> VS2013からアップグレードしたプロジェクトで、app.configファイルの読み取りを拒否しました。次に、AppDomain.CurrentDomain.SetupInformation.ConfigurationFileを介して、生成されていないXXX.vshost.exe.configを検索していることがわかりました。そのため、プロジェクトプロパティのデバッグタブでVS Hostingをオフにしました。次に、app.configファイルの名前を{projectName} .configに変更し、それをbinフォルダーに入れて、最終的に機能するようにし
なければなりませんでした

1
私のために働いていませんでした。 しかし、この答えはしました
ケイゼッド2016

4
.netコアはどうですか?
jjxtra 2018

64

厳密に言えば、単一の構成ファイルはありません。ASP.NET 1を除くと、組み込み(System.Configuration)サポートを使用して3つの構成ファイルを作成できます。マシン構成に加えて:app.exe.config、ユーザーローミング、ユーザーローカル。

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

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


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


2
最初に「Answer」を上げましたが、とても役に立ちました。しかし、結局私はこのアプローチが本当に必要だったので、ここに置いてくれてありがとう。
Noam Gal

System.configurationへの参照を追加することを忘れないでください
Black Horus

9

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

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

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

System.Reflection.Assembly.GetExecutingAssembly().Location

1
@Cedric Rupから「AppDomain.CurrentDomain.SetupInformation.ConfigurationFile」を提案してください。そうしないと、ASP.NETの状況やAppDomainsを使用している状況で例外が発生します。
Contango 2013年

6

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


6

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

問題が解決しました

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


4

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

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

これの良いところは、見た目はハッキーですが、.NET Standard 2.0でコンパイルできることです。.NET Core 2.0ではnullを返しますが、移行時に役立ちます。
EM0

3

設定ファイルの場所によっては、System.Reflection.Assembly.GetExecutingAssembly().Location必要なことが実行される場合があります。


2
さらに、同時に複数の「アクティブな」構成ファイルを持つことができます。Machine.config、フレームワークレベルのweb.config、アプリレベルの設定など...アプリで利用可能なすべての構成ファイルを解析せずに、一意の接続文字列ファイルの場所を自動的に見つける方法はないと思います。
ウィリアムエドモンドソン

3

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.