代码之家  ›  专栏  ›  技术社区  ›  mfeingold

托管COM聚合

  •  5
  • mfeingold  · 技术社区  · 15 年前

    据我所知,构建聚合现有COM对象的COM对象意味着在外部对象的iunknown.queryinterface方法中实现重定向逻辑。

    我的问题是,如果您正在构建的对象被管理,那么如何做到这一点。在托管对象上,iunknown不是显式实现的,com interop是为您实现的。那么,如何告诉COM Interop我构建的对象是另一个COM对象的聚合呢?

    到目前为止,我找到的唯一方法是在外部实现内部对象的所有接口,并显式地重定向它们。这是a)丑陋的和b)假设您知道要实现的所有接口,在我的情况下并不是这样。

    有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  7
  •   Pent Ploompuu    15 年前

    如果使用.NET 4,则可以使用 ICustomQueryInterface 覆盖默认值 IUnknown.QueryInterface 逻辑。 有一个 sample for COM aggregation 在codeplex上-实现非常简单:

    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;
    }