2011-09-18 8 views
0

C# .NET 응용 프로그램에서 외부 원시 COM 구성 요소를 사용하고 있습니다..Net의 RCW COM 개체 생성 매개 변수 (즉 요청 된 인터페이스)를 관리하는 방법은 무엇입니까?

이 COM dll에는 형식 라이브러리가 없으므로 interop 코드를 직접 작성해야하고 TlbImp처럼/idl 파일을 포함해야합니다. 하여 IClassFactory 실패에서 다음 오류 때문에

이 CLSID {40700425-0080-11D2-851F-00C04FC21759}와 COM 구성 요소의 인스턴스를 만들기 : 는하지만 최악의 상황은 객체 생성이 실패한다는 것입니다 80040111

원시 CoCreateInstance를 사용하고 class_id와 구현 된 인터페이스 iid 중 하나를 지정하면 클래스가 미세하게 만들어집니다.

COM 개체의 IClassFactory :: CreateInstance가 riid 매개 변수로 전달 된 IID_IUnknown을 지원하지 않으므로 CLASS_E_CLASSNOTAVAILABLE을 반환합니다 (디스어셈블러 및 디버거를 사용하여 식별했습니다). 구성 요소는 MS SQL VDI입니다.

.Net RCW가 IID_IUnknown 대신 CreateInstance 메서드에 다른 인터페이스 ID를 전달하도록 할 수있는 방법이 있습니까? 그물을 많이 검색했지만 찾지 못했습니다.

해결 방법 IID_IUnknown 대신 적절한 인터페이스를 요청하는 대신 개체를 크리에이트하기 위해 C++/CLI를 사용하고 있습니다. 지금이 목적을 위해,하지만 C++/CLI는 각 플랫폼마다 다른 DLL을 만들어야하기 때문에 C#에서 코드를 갖고 싶습니다.

감사합니다.

+0

CoCreateInstance()에서 IUnknown에 응답하지 않는 것은 버그입니다. 외부 라이브러리의 소유자가이를 고칠 수 있습니까? http://blogs.msdn.com/b/oldnewthing/archive/2004/03/26/96777.aspx –

+0

소유자는 Microsoft이며이 버그는 10 년 넘게 존재하고 있으며 그 버그를 고려하여 작성되었습니다. 구성 요소 사용을 차단하지 않습니다. 패치를 사용할 수 없을 것이라고 생각합니다. – mistika

+0

아, 와우. 정말 끝내주는 군. –

답변

0

I repro. 고통 스럽다. 당신은 CoCreateInstance를 pinvoke 할 수 있습니다 :

[return: MarshalAs(UnmanagedType.Interface)] 
[DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)] 
public static extern object CoCreateInstance(ref Guid clsid, 
    [MarshalAs(UnmanagedType.Interface)] object punkOuter, int context, ref Guid iid); 
+0

당신의 제안에 감사드립니다, 한스. 그것은 트릭을 수행하고, 단순한 랩퍼는 그것을 숨길 것입니다. (편집 - 하나님, 의견에 줄 바꿈을 게시하는 방법은 무엇입니까? NBoth Enter 및 CtrlEnter는 저장 버튼을 누릅니다). ... [DefaultInterfaceGuid ("XXXX-XXX-XXX")] 정도가됩니다. – mistika

+0

'을 사용하여 코드를 인용 할 수 있습니다. –