2009-02-09 4 views
20

저는 C# 클래스 라이브러리와 시작 프로젝트 (콘솔 앱)가 있습니다. 클래스 라이브러리에는 웹 서비스에 대한 서비스 참조가 포함됩니다. 프로젝트를 실행하려고하면 시작 프로젝트가 클래스 라이브러리의 app.config를 읽지 않아 InvalidOperationException이 발생하고 서비스 참조가 무시됩니다. 이를 작동 시키려면 동일한 서비스 참조를 시작 프로젝트에 추가해야합니다. 내가 이것을 피할 수있는 방법이 있습니까? 시작 프로젝트가 클래스 라이브러리의 서비스 참조 및 app.config를 시작 프로젝트에 복사하지 않고도 인식하도록 할 수 있습니까?클래스 라이브러리의 서비스 참조 포함

클래스 라이브러리에서 app.config에 대한 링크를 추가하려고 시도했지만 작동하지 않습니다. 클래스 라이브러리를 사용하여 서비스 참조를 시작 프로젝트에 추가해야하는 경우 클래스 라이브러리는 그다지 이식성이 없습니다.

+0

일을 : 안녕하세요. Zarjay, 저는 같은 질문을 할 것입니다. Andrew Hare와 동의하면서 이것이 불가능한 이유를 이해하는 동안, 솔루션이 라이브러리를 매우 이식성있게 만들어주지는 않는다는 것에 동의합니다. 궁금해, 구성 설정을 programatically 적용 할 수 있습니까? – andy

+0

확실하지 않지만 의심 스럽습니다. 그래도 굉장한 아이디어. 나는 config 파일에 쓸 수 있다는 것을 알고 있지만 코드가 가능할 때까지는 서비스 레퍼런스를 추가하기에는 너무 늦었다 고 생각한다. –

답변

14

생각 당신은 당신이 구축이 어셈블리를 가지고 :

Library 
ConsoleApp 

이러한 어셈블리는 모두 구성 파일을 가지고 - 나는 그들이 다음과 같이 보일 상상 :

Library 
    app.config 
ConsoleApp 
    ConsoleApp.exe.config 

ConsoleApp을 실행하면 Library 어셈블리에서 aboout app.config을 읽거나 알 수 없습니다. 알거나 걱정하는 유일한 구성 파일은 ConsoleApp.exe.config입니다. 이제는 구성 파일을 서로 참조 할 수는 있지만이 작업은 수행하려는 작업에 적절한 해결책이 아닙니다.

Library 어셈블리에는 진입 점이 없으므로 결코 AppDomain에로드되지 않습니다. AppDomain에로드되지 않으므로 응용 프로그램 구성 파일이 절대 사용되지 않습니다.

프로젝트 참조를 통해 Library (ConsoleApp)을 참조하십시오. 그런 다음 응용 프로그램에서 사용할 구성 파일이므로 모든 관련 구성 데이터를 app.config에서 ConsoleApp.exe.config으로 옮깁니다.

이것은 당신이 당신의 웹 서비스

  1. 보내고 SOAP 메시지를받을 수 Library의 코드에 메소드를 호출해야 할 두 가지에있을 수 있습니다.
  2. Library이 작동하는 데 필요한 구성 메타 데이터입니다.
+0

설명 주셔서 감사합니다; 왜 지금 작동하지 않는지 이해가됩니다. 저는 여전히 .NET에 익숙하지 않습니다. 클래스 라이브러리가 내부 구현이이 클래스를 사용하는 코드와 관련이없는 독립적 인 모듈 인 것을 선호하지만, 지금은 왜이 상황에서 작동하지 않는지 이해합니다. –

+0

config 데이터는 내부 구현이 아닙니다. 라이브러리 사용자 (콘솔 앱)가 제공해야하는 라이브러리 구성 데이터입니다. 필자의 일반적인 방법은 설정 파일이 필요할 때 app.config에 샘플 구성 텍스트를 라이브러리 프로젝트와 함께 제공 한 다음 라이브러리 사용자가 해당 설정 데이터를 자신의 설정 파일에 복사하여 다음과 같이 변경합니다. 적당한. 구성 파일이 필요하지 않은 경우 해당 옵션은 라이브러리의 프로그래밍 방식 구성 손잡이가됩니다. –

+7

그렉, 동의하지 않습니다. 라이브러리 구성 데이터는 개발자가 알 수있는 웹 서비스 URL과 같으며 사용자는 알 수 없습니다. 사용자는 URL이 무엇인지 신경 쓸 필요가 없습니다. 그것은 라이브러리의 내부 구현이며 인터페이스 (라이브러리)의 사용자로서 구현의 세부 사항 (사용중인 웹 서비스)을 신경 쓰지 않아야합니다. 감사합니다. 기능을 수행하는 데 사용하는 URL을 신경 쓰지 않고도 Google의 Java 클라이언트 라이브러리를 사용할 수 있습니다. 불행히도 .NET 버전이 있다면 걱정할 필요가 있습니다. 이 옵션이 없다는 것은 .NET의 큰 결함입니다. –

0

서비스를 가리키는 설정 키를 클래스 라이브러리 설정 파일에서 콘솔 앱의 설정 파일로 복사하기 만하면됩니다.

+0

내 app.config에 구성 키가 없습니다. 어떻게 지정합니까? –

+0

정적 또는 동적 참조를 사용하도록 선택할 수있는 웹 서비스를 참조 할 때 속성을 참조하십시오. 동적을 선택하면 IDE가 웹 서비스 프록시 클래스에서 구성 파일의 URL을 읽도록 코드를 생성합니다. 라이브러리 설정에서 생성 된 값을 콘솔 앱의 설정으로 복사하십시오. –

0

여러 구성 파일을 실행하고 있다면 혼란 스럽다고 생각합니다.

라이브러리에 구성 가능한 항목이있는 경우 라이브러리를 적절히 사용하려면 구성 파일에 해당 구성을 넣어야합니다.

1

app.config의 관련 부분을 클래스 라이브러리의 구성에서 콘솔 응용 프로그램의 app.config로 복사 할 수 있습니다.

정말로 진정한 이식성을 제공하려는 경우 클래스 라이브러리 내에서 특정 서비스 참조에 대한 주소를 참조하는 다른 방법을 고려해야합니다. - 당신이 뭘 하려는지에 대해

+0

app.config를 통해 복사를 시도했지만 서비스 참조를 추가하지 않으면 콘솔 앱이 실행되지 않습니다. 이식성은 실제로 우선 순위가 아닙니다. 나는 프로젝트에서 무엇인가를 중복해서 포함하는 것이 짜증 스럽다. 클래스 라이브러리는 자체 포함되어야합니다. –

+0

WCF 클라이언트 인 클래스 라이브러리는 의도적으로 자체 포함되어 있지 않습니다. 일반적으로 재배포를위한 것이 아닙니다. 그것들은 클라이언트 측에서 설정 가능하기 때문에, app.config가 이것들에 전형적입니다. 값을 항상 하드 코딩 할 수 있지만 그게 ... 잘 ... 하드 코딩. :) –

3

클래스 라이브러리에서 서비스 참조를 사용한 다음 구성을 복사하는 대신 svcutil.exe를 호출하는 빌드 이벤트를 사용하는 것이 좋습니다. 내가 이것에 대해 좋아하는 점은 서비스가 변경 될 때 "업데이트 서비스 참조"를 할 필요가 없다는 것입니다. 자동으로 업데이트됩니다. 는 config를 생성하는 빌드 이벤트를 사용하여 응용 프로그램에서

svcutil.exe net.tcp://localhost:3315/MyService/mex /noConfig 

: 클래스 라이브러리에서

만 프록시 코드를 생성하는 빌드 이벤트를 사용합니다./mergeConfig 옵션을 사용하여 기존의 app.config에 병합 할 수 있습니다. 이 서비스가 실행되고 있지 않은 경우 빌드 오류가 발생하지 않으려면

svcutil.exe net.tcp://localhost:3315/MyService/mex 
      /config:App.config /mergeConfig 

, 프로젝트 파일이 넣어 대신 오류의 경고를 얻을 것이다 :

<Target 
    Name="PreBuildEvent" 
    Condition="'$(PreBuildEvent)'!=''" 
    DependsOnTargets="$(PreBuildEventDependsOn)"> 
    <Exec WorkingDirectory="$(OutDir)" 
     Command="$(PreBuildEvent)" 
     ContinueOnError="true" /> 
</Target> 
관련 문제