Приведение интерфейса взаимодействия COM
После этой статьи я успешно перевел объявление класса / интерфейса C++ COM в C# следующим образом:
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(IfaceGuid)]
public interface IFoo
{
void Bar();
}
[ComImport, Guid(ClassGuid)]
public class Foo
{ }
Я использую это так:
var foo = new Foo();
var ifoo = (IFoo)foo;
ifoo.Bar();
Мой вопрос, как это может работать, учитывая, что Foo
не реализует IFoo
(даже во время выполнения, typeof(Foo).GetInterfaces()
пусто) и что пользовательские преобразования в интерфейсы запрещены?
Это специальная обработка, зарезервированная только для COM? Что спецификация C# должна сказать по этому поводу?
2 ответа
ComImport
типы обрабатываются по-разному по сравнению с "обычными" классами.NET, поскольку они представляют собой обертываемую во время выполнения оболочку вокруг базового COM-класса. Преобразование экземпляра одного из них в тип интерфейса COM прозрачно отображается в вызове реализации объекта метода интерфейса COM. IUnknown.QueryInterface
,
Если QI для запрошенного интерфейса завершается успешно на уровне COM, то приведение C# также будет успешным.
Ну да, приведение к классам помечено ComImport
к COM-интерфейсам в результате QueryInterface()
под капотом - это, я думаю, сделано внутри RCW.
Сюда new
приводит к CoCreateInstance()
вызывается, а затем актерский состав приводит к QueryInterface()
будучи призванным