2011-04-11 64 views
1

this article,我已經成功地轉換過來的C++ COM類/接口聲明成C#這樣的:COM互操作界面鑄造

[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#類型轉換也會成功。

1

嗯,是的,對於標記爲ComImport的COM類接口導致QueryInterface()下的引擎蓋 - 我猜是在RCW內部完成的。

這樣new導致CoCreateInstance()被調用,然後鑄造導致QueryInterface()被調用。