在本机COM接口中托管CLR,无法解析的外部符号_CStdStubBuffer_Release@4



我正在尝试托管CLR(目前没有尝试使用mono,但我可能会尝试)。基本上,我是这样做的:

http://www.lenholgate.com/blog/2010/07/clr -主机-灵活- -插件系统管理部分- 1. - html

然而,我在使用COM方面遇到了一些麻烦,因为在那篇文章中没有那么彻底地解释它,而且我正在一边学习一边学习(以前没有玩过COM)。

我定义了一个接口:

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);
}

并将生成的文件包含在我的本地项目中。但是,我无法构建可执行文件,因为链接器无法解析:_CStdStubBuffer_Release@4RpcRT4.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在windows SDK v7.0ARpcProxy.h中定义:

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

确实需要CStdStubBuffer_Release方法,尽管它与:http://msdn.microsoft.com/en-us/library/windows/desktop/ms764247%28v=VS.85%29.aspx.

有点不同。

我应该链接哪个库呢?

CStdStubBuffer_Release()是由midl.exe, dlldata.c自动生成的另一个文件实现的。DLLDATA_ROUTINES宏生成它。

这个问题指向一个项目配置错误,听起来像你把代理。c文件添加到你的主项目,而不是在代理/存根项目中使用它。它也会使用dlldata.c。我很确定在自定义CLR主机中不需要代理/存根,所以只需删除。c文件。

相关内容

  • 没有找到相关文章

最新更新