2010-05-12 4 views
1

다른 사람들이 자신의 프로젝트에서 컴파일 된 DLL로 참조 할 수있게 해주는 내부 API가 있습니다. 참조되는 독립 실행 형 프로젝트 인 경우 조건부 컴파일 (#if 문)을 사용하여 컴파일 기호에 따라 주요 웹 서비스 클래스의 동작을 전환합니다. 문제는 일단 어셈블리가 생성되면 원래 컴파일되었을 때 컴파일 기호가 무엇이든간에 고정되어있는 것처럼 보입니다. 예를 들어이 어셈블리가 DEBUG로 컴파일되고 다른 프로젝트가 참조하는 경우 (다른 프로젝트가 RELEASE로 빌드 된 어셈블리는 재 컴파일이 필요하지 않으므로 DEBUG에있는 것처럼 작동합니다. 그것은 의미가 있으며, 단지 배경을 제공합니다.C#의 조건부 컴파일 해커 -이 문제를 해결할 방법이 있습니까?

이제는 스위치의 app/web 구성 파일을 검색하는 등의 다른 방법으로 어셈블리의 동작을 전환 할 수 있도록 노력하고 있습니다. 문제는 그 전환 된 어셈블리의 코드 중 일부는 사이, 예를 들어, 방법에 대한 속성입니다입니다 :

#if PRODUCTION 
     [SoapDocumentMethodAttribute("https://prodServer/Service_Test", RequestNamespace = "https://prodServer", ResponseNamespace = "https://prodServer")] 
#else 
     [SoapDocumentMethodAttribute("https://devServer/Service_Test", RequestNamespace = "https://devServer", ResponseNamespace = "https://devServer")] 
#endif 
     public string Service_Test() 
     { 
      // test service 
     } 

나 다른 방식으로 동일한 유형의 두 속성 사이에 뒤집을 수있는 몇 가지 구문 설탕이있을 수 있지만 , 나는 그것을 모른다. 어떤 아이디어?

대체 방법은 어셈블리 대신 전체 프로젝트를 참조하는 것이지만 가능한 경우 컴파일 된 DLL을 참조하는 것이 좋습니다. 또한 문제가 해결되면 완전히 새로운 접근 방식을 사용할 수 있습니다.

답변

-1

글쎄, 처음부터, 조건부 컴파일은 컴파일 후에 그대로 유지됩니다. 도대체 어떻게 생각 났을까요? 조건부 컴파일러입니다.

리플렉션을 사용하여 속성을 수정할 수 있습니다. 리플렉션을 재정의하여 자신의 정보를 반환 할 수 있습니다. 까다로운 일이지만, 리플렉션 코드에 속성을 "삽입"하는 것과 같은 방법으로 가능합니다. 그래도 나는 그런 일이 일어나기를 바란다. 기본적으로 ... 리플렉션이 아닌 config 파일에서 서버 URL과 같은 것을 얻어야합니다. 틀린 접근, 나는 말할 텐데.

+0

+1에 따라 SoapDocumentMethodAttribute에서 유래하고,이 값을 설정하는 새로운 속성을 만들어야합니다! 하지만 당신은 단지 const를 취할 수 있습니다. – chriszero

+1

예, 조건부 컴파일은 내가 그 길로 향하고 있다는 것을 깨달았을 때 "오, 젠장, 이봐"순간이었습니다. 나는 반사에 대해 살펴보고, 그 경로가가는 것이면 두려워하지 않을 것입니다. 속성을 채우는 문자열은 const가되어야한다는 것을 알고 있습니다. 런타임시 설정 파일에서 읽을 수 없으므로 조건부 전환이 가능합니다. 그래도 그 시점에서 잘못되고 싶다. – Chris

+1

이 답변은 덜 무례 함으로 개선 될 수 있습니다. – Outback

6

이 작업을 수행 할 필요가 없습니다. 이러한 URL은 "실제"URL이 아니며 인터넷상의 위치를 ​​나타내지 않습니다. 이름은 고유 한 이름으로 만 사용됩니다.

제작시 dev와 동일한 네임 스페이스 이름을 사용해야합니다.

+0

호출하는 서비스에서 서비스 메소드의 네임 스페이스와 일치해야합니까? – Chris

+0

아니요, 할 필요는 없지만 할 수는 있습니다. 이름을 모호하게 만드는 것이 전부입니다.유형 이름과 동일한 조작 (메소드) 이름이있는 경우 다른 namespace를 사용하여 namespace + localname이 고유해야합니다. –

+0

우수합니다. 지침에 감사드립니다. 먼저이 길을 걸어 내려 가서 처음부터 XML 네임 스페이스에 대한 내 무지를 제거 할 것입니다. 어떤 방법 으로든 다른 것을 다치게 할 수 없었습니다! – Chris

2

문제는 컴파일 중에 만 실행되는 것입니다. 컴파일 된 어셈블리를 가져 오면 어셈블리의 나머지 부분이 어셈블리에서 제거됩니다.

당신이 테스트/생산을위한 다르게 URL을 원하는 경우, 당신은 당신의 AppSetting 값 : 설정 파일에 대한

+0

좋은 접근 방식. 예외 ... SoapDocumentMethodAttribute는 sealed 클래스입니다. –

관련 문제