C# での COM 型のシームレスな統合は、開発者の好奇心を刺激します。この記事では、COM 型を検出するコンパイラーのメカニズムを詳しく説明し、一見異常な操作をコンパイラーがどのように実現できるかを説明します。
COM 型処理の不可解な側面の 1 つは、アプリケーションなどのインターフェイスが C# で構築される方法です。 C# コンパイラでは、インターフェイス上でコンストラクターを呼び出すことが許可されているようですが、これは他の言語では通常禁止されている動作です。この錯覚は、暗黙的に Type.GetTypeFromCLSID() を呼び出して正しい COM クラスを取得し、その後 Activator.CreateInstance を呼び出してそのクラスのインスタンスを作成することによって実現されます。
さらに、C# 4 では、開発者が参照パラメーターに非参照パラメーターを提供できる機能が導入されました。コンパイラは、参照渡しするローカル変数を自動的に作成し、元の値を事実上破棄します。次のコードは、この動作を示しています:
<code class="language-c#">app.ActiveDocument.SaveAs(FileName: "test.doc");</code>
FileName パラメーターは技術的には参照パラメーターですが、コードでは定数値を渡しています。コンパイラはこの違いを透過的に処理します。
最初のシナリオ (インターフェイスを直接インスタンス化する) を模倣しようとすると、失敗することがわかりました。ただし、2 番目のシナリオは、次のように ref および in 修飾子を使用して複製できます。
<code class="language-c#">Dummy dummy = null; dummy.Foo(in 10);</code>
コンパイラが COM 型を認識できるようにするための鍵は、CoClass 属性です。インターフェイスに [CoClass(typeof(Test))] の注釈を付けることにより、コンパイラは基礎となる実装クラスの存在を推論し、それをインスタンス化するために必要なコードを生成できます。
この発見により、C# で COM 型を操作するための新たな可能性が開かれ、言語の相互運用性機能が強化されます。
以上がC# コンパイラは、COM 型の一見珍しいインスタンス化とパラメータの受け渡しをどのように処理するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。