2011-11-26 6 views
2

CLR 호스팅으로 실험하고 있습니다 (아마도 시도 할 것이지만 지금은 mono를 사용하지 마십시오). 나는 (천국 '을 가서 그렇게 철저하게 그 문서에 설명이 아니다으로CLR 호스팅 네이티브 - COM 인터페이스, 해결되지 않은 외부 기호 _CStdStubBuffer_Release @ 4

그러나 http://www.lenholgate.com/blog/2010/07/clr-hosting---a-flexible-managed-plugin-system-part-1.html

, 나는, COM 자체에 약간의 문제가있어, 나는 배우고 : 기본적으로, 나는이 다음 해요 이전에 COM에서 연주 해왔음).

는 I는 인터페이스를 정의했습니다 :

import "unknwn.idl"; 
[ 
    object, 
    uuid(55d96f88-9633-4ad7-b9de-1a546ea73307), 
    helpstring("INative interface"), 
    pointer_default(unique) 
] 
interface INative : IUnknown 
{ 
    HRESULT Write(BSTR s); 
} 
[ 
    object, 
    uuid(74eeeaaa-d73c-436e-b52d-5c8a972ce60a), 
    helpstring("ITestManager Interface"), 
    pointer_default(unique) 
] 
interface IManagedHost : IUnknown 
{ 
    HRESULT Init(INative* native); 
} 

을 그리고 내 기본 프로젝트에 파일을 생성 포함. 그러나 링커에서 확인할 수 없기 때문에 실행 파일을 빌드 할 수 없습니다. [email protected]. RpcRT4.lib은 연결되어 있지만 dumpbin rpcrt4.lib /all | grep _CStdStubBuffer_Release을 실행했으며 해당 라이브러리에서 내 보낸 것과 같은 것이 없습니다. CStdStubBuffer_DebugServerRelease입니다. 그래서, 그것이 존재하지 않아야한다고 가정한다면, 그 방법을 정확히 참조하는 것이 문제입니까?

좀 더 조사를했고, 나는이 방법은 IDL 도구에 의해 생성되는 .c 파일을 통해 참조하는 것을 발견했습니다

const CInterfaceStubVtbl _INativeStubVtbl = 
{ 
    &IID_INative, 
    &INative_ServerInfo, 
    4, 
    0, /* pure interpreted */ 
    CStdStubBuffer_METHODS 
}; 

및 CStdStubBuffer_METHODS는 윈도우 SDK v7.0ARpcProxy.h에 정의되어 있습니다 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms764247%28v=VS.85%29.aspx : 그것은 다른 약간 비록 실제로 그 CStdStubBuffer_Release 방법을 원하는

#define CStdStubBuffer_METHODS \ 
    CStdStubBuffer_QueryInterface,\ 
    CStdStubBuffer_AddRef, \ 
    CStdStubBuffer_Release, \ 
    CStdStubBuffer_Connect, \ 
    CStdStubBuffer_Disconnect, \ 
    CStdStubBuffer_Invoke, \ 
    CStdStubBuffer_IsIIDSupported, \ 
    CStdStubBuffer_CountRefs, \ 
    CStdStubBuffer_DebugServerQueryInterface, \ 
    CStdStubBuffer_DebugServerRelease 

.

그럼 다른 라이브러리를 연결해야합니까?

답변

3

CStdStubBuffer_Release()는 midl.exe, dlldata.c에 의해 자동 생성 된 다른 파일에 의해 구현됩니다. DLLDATA_ROUTINES 매크로가 DLLDATA_ROUTINES 매크로를 생성합니다.

이 문제는 프록시 구성 파일을 프록시/스텁 프로젝트에서 사용하는 대신 주 프로젝트에 추가 한 것과 같은 프로젝트 구성 오류를 나타냅니다. 또한 dlldata.c를 사용합니다. 사용자 지정 CLR 호스트에 프록시/스텁이 필요하지 않으므로 .c 파일을 제거하면됩니다.

+0

감사합니다. 프록시 파일이 일부 공유 dll에 있어야한다고 읽었지만 호스트 시나리오에이를 적용하는 것이 확실하지 않았습니다. – Bartosz

+0

proc 활성화 및 복잡한 COM 스레딩 모델 항목에 프록시 기능이 필요합니다. CLR 호스팅 시나리오에는이 중 어느 것도 필요하지 않으므로 해당 파일을 무시할 수 있습니다. –