활성 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

그것이 도움이되기를 바랍니다.


ASP.NET의 경우와 AppDomains를 사용하는 경우에는 작동하지 않는 Assembly.GetEntryAssembly () + ".config"를 사용하는 것보다 wayyyyyyyy가 더 좋습니다.
Contango

4
이 경로를 어떻게 바꿀 수 있습니까?
Vignesh Subramanian

감사합니다. VS2008-> VS2013에서 app.config 파일 읽기를 거부하는 프로젝트를 업그레이드했습니다. 그런 다음 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile을 통해 생성되지 않은 XXX.vshost.exe.config를 검색하고 있음을 알게되었습니다. 그래서 프로젝트 속성 디버그 탭에서 VS 호스팅을 해제했습니다. 그런 다음 app.config 파일의 이름을 {projectName} .config로 바꾸고 bin 폴더에 넣고 마침내 작동했습니다
drzounds

1
나를 위해 작동하지 않았다. 그러나이 답변은 해냈 습니다.
Kay Zed

4
.net 코어는 어떻습니까?
jjxtra

64

엄밀히 말하면, 단일 구성 파일이 없습니다. ASP.NET 1을 제외 하고 내장 ( System.Configuration) 지원을 사용하는 세 개의 구성 파일이있을 수 있습니다 . 머신 구성 외에도 app.exe.config사용자 로밍 및 로컬 사용자.

"전역"구성을 얻으려면 ( exe .config) :

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

ConfigurationUserLevel로밍 및 로밍 구성 파일마다 다른 값을 사용하십시오 .


1 하위 폴더 (IIS- 가상 또는 파일 시스템)의 내용 web.config(설정에 따라 다름)이 부모의 항목을 추가하거나 재정의 할 수 있는 완전히 다른 모델이 있습니다 web.config.


2
나는 처음에 "답변"을 올렸는데, 그것은 매우 도움이되었습니다. 그러나 결국에는이 접근법이 정말로 필요했기 때문에 여기에 올려 주셔서 감사합니다.
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

6

파일의 속성을 클릭하고 "항상 복사"로 설정했는지 확인하십시오. 그렇지 않으면 행복한 lil dll과 함께 Debug \ 폴더에 없어서 필요한 위치를 구성하고 더 많은 cowbell을 추가하십시오


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, framework level web.config, app level config 등 ... 따라서 앱에서 사용할 수있는 모든 구성 파일을 구문 분석하지 않고 고유 한 연결 문자열 파일 위치를 자동으로 찾는 방법이 없다고 생각합니다.
William Edmondson

3

웹 응용 프로그램 (실제로 로컬에서 실행되는 Azure 웹 역할)에서 이전 답변 중 하나를 시도했지만 제대로 작동하지 않았습니다. 그러나이 비슷한 접근법이 효과가있었습니다.

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.