关注this article,我已成功将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#规范对此有何看法?
答案 0 :(得分:2)
ComImport
类型的处理方式不同.NET类,因为它们构成了基础COM coclass的运行时可调用包装器。将其中一个实例转换为COM接口类型将透明地映射到对象的COM接口方法IUnknown.QueryInterface
实现的调用中。
如果请求的接口的QI在COM级别成功,那么C#cast也将成功。
答案 1 :(得分:1)
嗯,是的,将标有ComImport
的类转换为COM接口会导致QueryInterface()
在引擎盖下 - 我想这是在RCW中完成的。
这种new
导致CoCreateInstance()
被调用,然后投射导致QueryInterface()
被调用。