我正在尝试托管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@4
。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在windows SDK v7.0A
的RpcProxy.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文件。