5

私の理解では、既存の COM オブジェクトを集約する COM オブジェクトを構築することは、外部オブジェクトの IUnknown.QueryInterface メソッドにリダイレクト ロジックを実装することを意味します。

私が持っている質問は、あなたが構築しているオブジェクトが管理されている場合、それを行う方法です。マネージド オブジェクトでは、IUnknown は明示的に実装されていません。COM Interop がそれを行います。では、作成するオブジェクトが別の COM オブジェクトの集合体であることを COM Interop に伝えるにはどうすればよいでしょうか。

これまでのところ、私が見つけた唯一の方法は、内部オブジェクトのすべてのインターフェースを外部オブジェクトに実装し、それらを明示的にリダイレクトすることです。これは a) 醜く、b) 実装するすべてのインターフェイスを知っていることを前提としていますが、私の状況ではそうではありません。

何かご意見は?

4

1 に答える 1

7

.NET 4 を使用している場合は、ICustomQueryInterfaceIUnknown.QueryInterfaceを使用して既定のロジックをオーバーライドできます。CodePlexでの COM 集約のサンプルがあります。実装は非常に簡単です。

CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out IntPtr ppv)
{
    if(iid.Equals(new Guid("00000000-0000-0000-0000-000000001234")))
    {
        ppv = Marshal.GetComInterfaceForObject(this.innerObject, typeof(IInnerInterface), CustomQueryInterfaceMode.Ignore);
        return CustomQueryInterfaceResult.Handled;
    }
    ppv = IntPtr.Zero;
    return CustomQueryInterfaceResult.NotHandled;
}
于 2009-12-30T16:50:50.493 に答える