Управляемая агрегация COM
Насколько я понимаю, создание COM-объекта, объединяющего существующий COM-объект, подразумевает реализацию логики перенаправления в методе IUnknown.QueryInterface внешнего объекта.
У меня вопрос: как это сделать, если объект, который вы строите, управляется? На управляемых объектах IUnknown явно не реализована, COM Interop сделает это за вас. Итак, как мне сказать COM Interop, что созданный мной объект является агрегатом другого COM-объекта?
Пока единственный способ, который я нашел, - это реализовать все интерфейсы внутреннего объекта на внешнем и явно перенаправить их. Это а) некрасиво и б) предполагает, что вы знаете все интерфейсы для реализации, что не так в моей ситуации.
Какие-нибудь мысли?
1 ответ
Если вы используете.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;
}