繁体   English   中英

COM互操作界面转换

[英]COM interop interface casting

本文之后 ,我已经成功地将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#规范对此要说些什么?

与“常规” .NET类相比, ComImport类型的处理方式有所不同,因为它们构成了围绕基础COM协同类的运行时可调用包装器。 将其中之一的实例强制转换为COM接口类型将透明地映射到对COM接口方法IUnknown.QueryInterface的对象实现的调用。

如果所请求接口的QI在COM级别成功,则C#强制转换也将成功。

好吧,是的,将标有ComImport类强制转换为COM接口会导致QueryInterface()在幕后-我猜是在RCW内部完成的。

这样, new导致调用CoCreateInstance() ,然后强制转换导致调用QueryInterface()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM