【发布时间】:2012-07-17 15:27:56
【问题描述】:
我有一个 C# 客户端,它使用来自本机 C++ COM 服务器 dll 的接口。 DLL 实现了 4 个接口。这 4 个接口由 DLL 中的 4 个组件类实现。但是只有 1 个 coclass 暴露给客户。接口 2,3,4 通过接口 1 中的方法之一返回给客户端。
C++ COM 服务器:
interface IFace1: IUnknown{
HRESULT CreateOtherInterface([in] REFIID iidFace, [out, iid_is(iidFace)] void** ppOut);
};
coclass ClassIFace1
{
[default] interface IFace1;
};
C# 客户端:
ClassIFace1 Face1Obj = new ClassIFace1();
IFace1 Face1Ctrl = (IFace1)Face1Obj;
IFace2 Face2Ctrl = null;
IntPtr Face2IntPtr = new IntPtr();
Face1Ctrl.CreateOtherInterface(Face2Guid, out Face2IntPtr);
Face2Ctrl = (IFace2)Mashal.PtrToStructure(Face2IntPtr);
//Consume Face2Ctrl
if(Face1Obj != null)
{
Marshal.ReleaseComObject(Face1Obj);
}
由于 IFace2、IFace3 和 IFace4 与 IFace1 不共享相同的 coclass,我怀疑 Marshal.ReleaseComObject(Face1Obj) 行只会破坏 ClassIFace1 对象,但不会破坏 ClassIFace2、ClassIFace3、ClassIFace4 对象并导致内存泄漏。有没有办法解决这个问题?还是 Marshal.ReleaseComObject(Face1Obj) 实际上也破坏了其他 COM 对象?
【问题讨论】:
-
也许我应该在这里更具体一些。 COM 服务器将与设备通信。并且不同的设备暴露了一组不同的功能。每个特性都实现为一个特性接口,如IFace2、IFace3等。客户端只需要给出他们感兴趣的特性的iid,如果设备支持,COM服务器将返回该特性接口,否则调用失败.
-
客户不知道 IFace2、IFace3 等是否使用与 IFace1 相同的 coclass 实现(实际上它们是不同的 coclass),他们也不关心。他们只是从 IFace1 中获取所有功能接口,并在完成后单独发布功能接口。这种方法多年来一直适用于 C++ 客户端,直到我们需要实现一个 C# 客户端来与 COM 服务器对话。