我理解构建聚合现有COM对象的COM对象意味着在外部对象的IUnknown.QueryInterface方法中实现重定向逻辑。
我遇到的问题是如果您正在构建的对象是如何管理的。在托管对象上,未明确实现IUnknown COM Interop为您完成。那么如何告诉COM Interop我构建的对象是另一个COM对象的聚合?
到目前为止,我找到的唯一方法是在外部实现内部对象的所有接口并显式重定向它们。这是a)丑陋和b)假设您知道要实现的所有接口,而在我的情况下并非如此。
有什么想法吗?
答案 0 :(得分:7)
如果您使用的是.NET 4,则可以使用ICustomQueryInterface覆盖默认的IUnknown.QueryInterface
逻辑。
CodePlex上有sample for COM aggregation - 实现非常简单:
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;
}