ホームページ > バックエンド開発 > C++ > C# コンパイラは COM 型のインスタンス化と Ref パラメータの受け渡しをどのように処理しますか?

C# コンパイラは COM 型のインスタンス化と Ref パラメータの受け渡しをどのように処理しますか?

Susan Sarandon
リリース: 2025-01-10 17:32:48
オリジナル
297 人が閲覧しました

How Does the C# Compiler Handle COM Type Instantiation and Ref Parameter Passing?

C# での COM 型の検出

C# コンパイラが COM 型を処理する方法は非常に独特です。注目すべき例は、次の例に示すように、インターフェイスをインスタンス化する機能です。

<code class="language-csharp">Word.Application app = new Word.Application();</code>
ログイン後にコピー
Application はインターフェースですが、インスタンス化することができます。これは、呼び出しを Type.GetTypeFromCLSID() および Activator.CreateInstance に変換することで実現されます。

C# 4 のもう 1 つのユニークな動作は、非参照パラメータを参照パラメータに渡す機能です。コンパイラは、実際の値に影響を与えることなく、参照によってパラメータを渡すためのローカル変数を自動的に追加します。

コンパイラーがこれらの変換をどのように実行するかを理解するために、カスタム例を作成できます。

<code class="language-csharp">[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
    void Foo(ref int x);
}

class Test
{
    static void Main()
    {
        Dummy dummy = null;
        dummy.Foo(10);
    }
}</code>
ログイン後にコピー
このコードは正常に実行され、ref パラメーターを値で渡す方法を示します。

ただし、インターフェースのインスタンス化を試してみたいとします。

<code class="language-csharp">Dummy dummy = new Dummy();</code>
ログイン後にコピー
このコードは正常に実行されませんが、コンパイラの「魔法」を調査する必要があることがわかります。実際にインターフェイスをインスタンス化するには、CoClass 属性を使用できます:

<code class="language-csharp">[System.Runtime.InteropServices.CoClass(typeof(Test))]
public interface Dummy { }</code>
ログイン後にコピー
CoClass 属性は実装クラスをインターフェイスに関連付け、具象オブジェクトとしてインスタンス化できるようにします。このアプローチは通常、COM API でインターフェイスのインスタンス化が必要な場合に使用されます。

以上がC# コンパイラは COM 型のインスタンス化と Ref パラメータの受け渡しをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート