Это - мое понимание, создающее COM-объект, агрегировавший существующий COM-объект, подразумевает логику перенаправления реализации в IUnknown. Метод QueryInterface внешнего объекта.
Вопрос, который я имею, состоит в том, как сделать это, если объектом, который Вы создаете, управляют. На управляемых объектах IUnknown не является явно реализованным COM Interop, делает это для Вас. Таким образом, как я говорю COM Interop, что объект, который я создаю, является агрегированием другого COM-объекта?
До сих пор единственный способ, которым я нашел, состоит в том, чтобы реализовать все интерфейсы внутреннего объекта на внешнем и явно перенаправить их. Это ужасно b) a) ужасный и b) предполагает, что Вы знаете, что все интерфейсы реализуют, который не имеет место в моей ситуации.
Какие-либо мысли?
] Если вы используете .NET 4, то вы можете использовать []ICustomQueryInterface[] для переопределения логики по умолчанию []IUnknown.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;
}
]