문제 요약 : 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 서비스를 사용하는 트릭은 무엇입니까?
당신이 원하는 것은 확실히 가능합니다 - 어떻게 WCF 클라이언트를 만들었습니까? –