ネイティブC++COMサーバーdllからのインターフェイスを使用するC#クライアントがあります。DLLは4つのインターフェイスを実装します。これらの4つのインターフェイスは、DLLの4つのコクラスによって実装されます。ただし、クライアントに公開されるコクラスは1つだけです。インターフェイス2、3、4は、インターフェイス1のメソッドの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と同じコクラスを共有しないため、Marshal.ReleaseComObject(Face1Obj)行はClassIFace1オブジェクトのみを破棄し、ClassIFace2、ClassIFace3、ClassIFace4オブジェクトは破棄せず、メモリリークが発生する可能性があります。これを解決する方法はありますか?または、Marshal.ReleaseComObject(Face1Obj)は実際に他のCOMオブジェクトも破棄しますか?