2010-01-29 4 views
4

내 WAP 프로젝트에서 다른 C# 프로젝트 (비 웹)에 대한 참조가 있습니다. 그 C# 프로젝트에서 나는 app.config를 가지고 있고 그것을 [projectName] .config로 이름을 바꾼다.App.Config에서 키를 검색 할 수 없습니다.

나는 나의 C# 프로젝트 내에서 내 [project] .config 파일의 일부 코드에서 키를 얻으려고했는데 그것을 찾으십시오 :

return ConfigurationManager.AppSettings["somekey"] 

그래서 왜 내 app.config를 읽을 수 없는지 궁금합니다. 나는 ConfigurationManager가 웹 프로젝트의 web.config와 내 [projectName] .config (app.config) 키를 읽고 참조 된 프로젝트에도 키를 읽을 수있을 것이라고 생각할 것입니다. 당신의 Web.config이 퍼팅

+0

당신의 "somekey는"프로젝트에 사이에 있나요 상단에 디자인 문제로 파일이 질문에 대한 대답을 투표의 .config DLL 당에 대한 좋은 논의가있다 .config 파일? –

+1

은'project.config'라는 파일이거나'project.exe' 응용 프로그램 옆에있는'project.exe.config' 파일입니까? 컴파일시 app.config 파일의 이름이 자동으로 project.config로 변경되므로 app.config 파일의 이름을 변경하지 마십시오 ..... –

+0

내 파일을 app.config로 다시 변경했습니다. 다시 컴파일 된 내 C# 프로젝트 (내 웹 프로젝트 참조) 및 여전히 내 .aspx 코드 숨김 내 참조 된 프로젝트의 app.config 해당 구성 키를 읽을 수 없습니다 – PositiveGuy

답변

6

ConfigurationManager는 the configuration of the application's host으로 표시됩니다. 귀하의 경우에는 웹 응용 프로그램이 응용 프로그램의 호스트입니다. 따라서 참조 된 dll에서 ConfigurationManager를 호출하더라도 ConfigurationManager를 호출하면 web.config에서 읽을 수 있습니다.

웹 응용 프로그램이 dll을 참조하면 dll은 web.config에서 구성을 가져와야합니다. 이것은 응용 프로그램을위한 최고의 것입니다. dll이 여러 유형의 응용 프로그램에서 참조되는 경우 구성의 설정이 다를 수 있습니다.

5

시도 :

<appSettings file="externalSettings.config"/> 

externalSettings.config 사용하려는 다른 설정 파일입니다.

웹 이외의 어셈블리 인 경우 AssemblyName.dll을 찾고 AssemblyName은 어셈블리 이름과 일치합니다. 예 : 어셈블리 이름이 Com.MyProject.Library1.dll 인 경우 찾고있는 구성 파일은 Com.MyProject.Library1.dll.config입니다.

UPDATE : 나는이에 대한 몇 가지 더 많은 연구를했고, here을 언급 한 바와 같이,는 "ConfigurationManager가이 응용 프로그램을로드 할 때 응용 프로그램 도메인에 의해로드 된 구성 파일에서 읽습니다." 따라서 웹 응용 프로그램의 경우 aspx 코드에서 ConfigurationManager에 액세스하는 경우 web.config 파일에서 읽을 것입니다.

나는 당신이 원하는 것을하기위한 가장 적절한 해결 방법은 이미 제공 한 해결 방법, 즉 appSettings 구성 매개 변수를 사용하여 aspx 응용 프로그램과 클래스 라이브러리에 대한 공유 구성 파일을 가질 수 있다고 생각합니다 .

<appSettings> 
    <add key="Key1" value="test"/> 
</appSettings> 

이의이 파일이 c:\temp\shared.config이었다 가정 해 봅시다 : 예를 들어

은 공유 구성 파일에서, 당신은 이런 식으로 뭔가를 원하는 것입니다. 그런 다음 web.config에서 다음과 같이 참조 할 수 있습니다.

<appSettings file="C:\\temp\\shared.config"></appSettings> 

이 클래스는 클래스 라이브러리의 app.config에 넣습니다.

그리고 지금 당신이 사용할 수 있습니다 :

당신의 영문 응용 프로그램 또는 클래스 라이브러리 중 하나에서
ConfigurationManager.AppSettings["Key1"] 

하고 값을 얻을 수 있습니다.

그래서 "aspx 및 클래스 라이브러리에서 공유되는"공통 구성 매개 변수가 정말로 필요한 경우이 방법을 사용하십시오.

+0

흠, 나는 내 다른 프로젝트를 참조했다 웹 프로젝트는 자동으로 해당 설정 파일을 찾을 수 있습니다. 어쩌면 내가 이름을 바꾸었을 까? – PositiveGuy

+0

가능성이 높습니다. 내 초기 응답 (내가 삭제)은 AssemblyName.dll.config (AssemblyName은 웹 프로젝트가 아닌 어셈블리의 이름)를 찾습니다. 따라서 이름을 변경하면 찾을 수 없습니다. 하지만 당신이 어떤 이유로 다른 이름을 사용하고 싶다면 위의 방법이 좋은 해결책이라고 생각합니다. – dcp

1

구성은 항상 실행중인 어셈블리에서 읽습니다.

그래서 적절한 * .config 파일에 필요한 설정을 지정해야합니다. 이 파일을 편집해야하는 모든 사람에게 쉽습니다.

0

위에서 말했듯이 응용 프로그램 .config 파일 이름을 변경해서는 안되며 아무 효과가 없습니다. 그 이유는 기본적으로 컴파일러가 App.config 내용을 Debug [AppName] .exe.config에 복사하기 때문입니다.그런 다음 응용 프로그램이로드되면 .NET CLR은 [AppName] .exe.config의 데이터를 메모리로로드 한 다음 절대로 다시 액세스하지 않습니다.

0

여기에 두 가지 가능성이 있습니다

첫째, 비주얼 스튜디오 프로젝트에서 here 언급 한 바와 같이, 프로젝트 디렉토리에 .config 파일을 배치하고 항상 복사하려면 출력 디렉터리 속성의 복사를 설정하거나 새로운하면 복사가. Visual Studio는 자동으로 파일을 어셈블리를 컴파일하는 디렉터리에 복사합니다.

두 번째 방법은 ConfigurationManager::OpenExeConfiguration 메서드를 사용하여 명시 적으로 구성을로드하는 것입니다 (자세한 내용은 here).

0

bin 디렉토리에서 * .config 파일을로드합니다.

public Configuration DllConfiguration(string filename) 
{ 
    var map = new ExeConfigurationFileMap { 
     ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename) 
    }; 

    return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
} 

C# DLL config file

관련 문제