据我所知,构建聚合现有COM对象的COM对象意味着在外部对象的iunknown.queryinterface方法中实现重定向逻辑。
我的问题是,如果您正在构建的对象被管理,那么如何做到这一点。在托管对象上,iunknown不是显式实现的,com interop是为您实现的。那么,如何告诉COM Interop我构建的对象是另一个COM对象的聚合呢?
到目前为止,我找到的唯一方法是在外部实现内部对象的所有接口,并显式地重定向它们。这是a)丑陋的和b)假设您知道要实现的所有接口,在我的情况下并不是这样。
有什么想法吗?
如果使用.NET 4,则可以使用 ICustomQueryInterface 覆盖默认值 IUnknown.QueryInterface 逻辑。 有一个 sample for COM aggregation 在codeplex上-实现非常简单:
IUnknown.QueryInterface
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; }