2013-08-08 1 views
3

문제 요약 : COM interop 사용/표시되는 C# DLL이 있습니다. 이 C# DLL에는 WCF 서비스에 대한 서비스 참조가 있습니다. C# 코드에서 WCF 서비스를 인스턴스화하면 COM interop에서 HRESULT (0x80131509) 오류를 반환합니다.COM interop 지원 DLL에서 WCF 서비스를 어떻게 참조합니까?

문제 세부 정보 :
내 솔루션에는 세 가지 구성 요소가 있습니다. 첫 번째는 관리되지 않는 C++ 응용 프로그램입니다. 이 C++ 응용 프로그램은 WCF 서비스와 통신해야합니다. 필자가 결정한 접근 방식은 C++ 응용 프로그램과 WCF 서비스 사이에 C# 중간 계층을 만드는 것이 었습니다. C# 계층은 COM interop enabled/visible이므로 C++ 응용 프로그램이 호출 할 수 있고 C# 코드는 WCF 서비스와 통신 할 수 있습니다. C++ 측은 WCF 서비스에 대해 알 필요가 없습니다. COM interop 호출은 관련이있는 한 블랙 박스가됩니다.

C# 코드에서 WCF 서비스 클라이언트를 인스턴스화 할 때 문제가 발생합니다. 테스트를 용이하게하기 위해 C# DLL에서 Test() 메서드를 만들었습니다. Test()를 호출하면 하드 코딩 된 테스트 문자열이 반환됩니다. 이 작동합니다. COM interop을 통해 C# DLL을 호출하는 C++ 응용 프로그램을 시작할 수 있으며 테스트 문자열이 반환됩니다. HRESULT는 S_OK입니다. 이제 줄을 추가하여 Test() 메서드를 변경하면 WCF 클라이언트를 간단하게 인스턴스화하는 줄이 생기므로 COM interop 호출은 이제 0x80131509의 HRESULT를 반환합니다.

경고 : 형식 라이브러리 내보내기 경고 처리 '[내 WCF 서비스]

내가 가진 유일한 단서는 제가 C#을 DLL을 컴파일 할 때, 나는 다음과 같은 경고를 얻을 수 있다는 것입니다. 경고 : 형식 라이브러리 익스포터는 제네릭 클래스에서 파생되고 [ClassInterface (ClassInterfaceType.None)]으로 표시되지 않은 유형이 있습니다. 이러한 유형의 클래스 인터페이스는 노출 될 수 없습니다. [ClassInterface (ClassInterfaceType.None)]로 유형을 표시하고 ComDefaultInterface 속성을 사용하여 명시 적 인터페이스를 COM의 기본 인터페이스로 표시하는 것을 고려하십시오. 는 WCF 서비스 유형을 수출에 대해 나에게 경고를주는 이유

모르겠어요. C# 중간 계층을 사용하면 C++ 응용 프로그램에서 WCF 서비스의 존재를 격리시킬 수 있기를 바랬습니다.

그래서 COM에서 사용/표시되는 DLL에서 WCF 서비스를 사용하는 트릭은 무엇입니까?

+0

당신이 원하는 것은 확실히 가능합니다 - 어떻게 WCF 클라이언트를 만들었습니까? –

답변

1

고통의 며칠 후, 해결 방법이 발견되었지만 실제 해결책보다 해결 방법이 더 많습니다.

C# 코드에서 WCF 서비스를 인스턴스화 할 때 예외가 발생한다는 것을 깨달았을 때 단서를 발견했습니다. C++ 측에있는 예외 (정확히 CAtlException)를 트래핑하고 HRESULT 코드를 살펴본 후, 나는 WCF 서비스 바인딩을 찾을 수 없기 때문에 C++ 프로그램이 불평하고 있다고 판단했다. 무엇을 기다립니다? 다소 불신, 나는 .exe.config 파일을 생성하고 실행 파일과 같은 디렉토리에 넣어. .exe.config 파일에는 WCF 서비스 프로젝트의 app.config 내용과 기본적으로 endpoint 태그가 WCF 서비스의 주소를 가리키는 system.serviceModel 섹션의 client 태그가 포함되어 있습니다. 모든 것이 제대로 작동했습니다.

그래도 나에게는 잘못된 것 같습니다. 왜 C++ 프로그램이이를 알아야합니까? 논리적으로 생각하면 C# COM interop은 지식을 분리하고 WCF 계층을 완전히 캡슐화하는 장벽 역할을해야합니다.C++ 프로그램이 기본 구조를 알도록 강제함으로써 캡슐화를 무효화하고 모든 것을 조금 더 우아하게 만듭니다. COM 상호 운용성의 복잡한 내부가 어떻게 작동하는지 모를 가능성이 있습니다. 어쩌면 모든 것이 누군가에게 의미가있을 수 있습니다.