Приведение интерфейса взаимодействия COM - PullRequest
1 голос
/ 11 апреля 2011

После этой статьи я успешно перевел объявление класса / интерфейса 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 ]

2 голосов
/ 11 апреля 2011

ComImport типы обрабатываются по-разному по сравнению с «обычными» классами .NET, поскольку они представляют собой обертываемую во время выполнения оболочку вокруг нижележащего COM-класса. Преобразование экземпляра одного из них в тип интерфейса COM прозрачно отображается в вызове реализации объекта метода интерфейса COM IUnknown.QueryInterface.

Если QI для запрошенного интерфейса завершается успешно на уровне COM, то приведение C # также будет успешным.

1 голос
/ 11 апреля 2011

Ну, да, приведение классов, отмеченных ComImport к COM-интерфейсам, приводит к QueryInterface() под капотом - что, я думаю, делается внутри RCW.

Таким образом, new приводит к вызову CoCreateInstance(), а затем приведение к QueryInterface() вызывается.

...