我有一个 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 对象?