Приведение интерфейса взаимодействия 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() будучи призванным

Другие вопросы по тегам