5

私はよく知られたインターフェースを持っているとしましょう。IWellKnownInterfaceこれは既知でありCOM-visible、登録されています。

C#,このオブジェクトの管理された (正確には) 実装もあります。

public class MyWellKnownClass : IWellKnownInterface { ... }

最後に、externこのインターフェイスのオブジェクトを受け入れるメソッドがあります。

[Whatever]
private static extern void ExternMethod(IWellKnownInterface veryWellKnown);

質問1:

CLR観点から、次のコードの下で何が起こるか知りたいです。

IWellKnownInterface a = new MyWellKnownClass();
ExternMethod(a);

マネージ コードからアンマネージ COM オブジェクトを呼び出すことについて話している場合Runtime Callable Wrapper、適切な引数変換を使用して、適切なオブジェクトを構築し、それを介して呼び出しを委任することがすべてであることは承知しています。ただし、マネージ COM オブジェクトがあり、それがアンマネージ コードで使用されている場合の状況に関する情報は見つかりませんでした。

質問2:

タイプは、同じ状況でdynamicの動作にどのように影響しますか? CLR内部の管理対象から非管理対象への相互運用ロジックを何らかの方法で変更しますか? MyWellKnownClassインスタンスのラッパーをいくつか追加することはできますか?

dynamic a = new MyWellKnownClass();
ExternMethod(a);
4

1 に答える 1

3

質問1:

最初の行は、オブジェクトを作成するだけです。他の CLR オブジェクトとは、特別なことや異なることは何もありません。これは、アンマネージ コードに実際にマーシャリングされたものがないためです。

ただし、2 行目では、COM 呼び出し可能ラッパーが作成され、アンマネージ コードにマーシャリングされます。これは、アンマネージ コードから COM インターフェイスのマネージ実装への呼び出しを処理する、ランタイム呼び出し可能ラッパーの逆と考えてください。

質問2:

dynamicタイプは呼び出しにまったく影響しません。この特定のケースでは、マネージ参照をアンマネージ コードに渡しています。の型はa です MyWellKnownClass。唯一のことは、その呼び出しがマネージ コードでdynamicどのように解決されるかを変更することです。COM 呼び出し可能ラッパーが作成されると、変数ではなくのインスタンスへのハード参照があります。唯一の変更点は、が呼び出されたときに、呼び出されたメソッドの解決がコンパイル時ではなく実行時に行われることです。MyWellKnownClassdynamicExternMethod

于 2012-10-02T15:04:50.087 に答える