1

この記事に従って、次のように 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# の仕様はこれについて何を述べているのでしょうか?

4

2 に答える 2

2

ComImportタイプは、基礎となるCOMコクラスのランタイム呼び出し可能なラッパーを構成するため、「通常の」.NETクラスとは異なる方法で処理されます。これらのいずれかのインスタンスをCOMインターフェイスタイプにキャストすると、オブジェクトのCOMインターフェイスメソッドの実装への呼び出しに透過的にマッピングされますIUnknown.QueryInterface

要求されたインターフェイスのQIがCOMレベルで成功した場合、C#キャストも成功します。

于 2011-04-11T13:50:55.123 に答える
1

そうです、 でマークされたクラスのComImportCOM インターフェイスへのキャストQueryInterface()は内部で行われます。これは RCW 内で行われると思います。

この方法でnew呼び出さCoCreateInstance()れ、キャストQueryInterface()が呼び出されます。

于 2011-04-11T13:50:11.003 に答える