C# の extern キーワード

Muhammad Zeeshan 2023年10月12日
  1. C#extern
  2. C# での extern の仕組み
C# の extern キーワード

今日の記事では、C# での extern キーワードの機能について学習します。

C#extern

外部実装メソッドの宣言は、extern 修飾子を使用して行われます。Interop サービスを利用してアンマネージコードを呼び出す場合、extern 修飾子は DllImport 属性と組み合わせて使用​​されることがよくあります。

この状況では、メソッドを static として定義する必要があります。

extern キーワードを使用して外部アセンブリエイリアスを作成し、同じコンポーネントの複数のバージョンを単一のアセンブリ内で参照できるようにすることもできます。

abstractextern の両方の修飾子を同時に使用して単一のメンバーを変更することは許可されていません。abstract 修飾子を使用する場合、メソッド実装が C# コードの外部にあることを示唆する extern 修飾子を使用する場合とは対照的に、メソッド実装がクラスで提供されないことを示します。

C# での extern の仕組み

宣言に extern 修飾子が含まれている場合、メソッドは外部メソッドと見なされることに同意します。外部メソッドの実装は、多くの場合 C# の外部で行われ、異なるプログラミング言語を使用します。

外部メソッド宣言には実際の実装が含まれていないため、外部メソッドのメソッド本体は単一のセミコロンで構成されます。外部メソッドがジェネリックではない可能性があります。

extern 修飾子は、多くの場合、DllImport プロパティと組み合わせて使用​​されます。この組み合わせにより、ダイナミックリンクライブラリまたは DLL に外部モジュールのメソッドを組み込むことができます。

実行環境は、外部メソッドの実装を提供することを可能にする追加の手法をサポートする可能性があります。外部メソッドに DllImport プロパティがある場合、正しく機能するには、メソッド宣言にも static 修飾子が必要です。

構文:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

例:

この例では、extern エイリアスを使用して機能をインポートし、必要に応じてその機能を使用する場合があります。

外部の alias を使用する場合、1つの完全修飾名が 2つのタイプを参照する場合があります。2つのエンティティが同じ完全修飾名を持っている場合、namespace とタイプ names が同じであることを示します。

これは、2つの種類が 2つの別々のアセンブリから発生した場合にのみ発生する可能性があります。

  1. info1.dll にコンパイルされた最初のライブラリ

    namespace information {
      public class info {}
    }
    
  2. info2.dll にコンパイルされた 2 番目のライブラリ

    namespace information {
      public class info {}
    }
    
  3. 以下は、info1.dll および info2.dll ファイルを使用するアプリケーションの例です。

    using info;
    class Test {
      static void Main() {
        information i = new information();
      }
    }
    
  1. information が明確でないため、アプリケーションをコンパイルできません。この状況では、extern エイリアスを使用して不確実性を解消できます。

    まず、アプリケーションが使用する .csproj ファイルを変更し、各参照に個別の alias を指定する必要があります。

    <ItemGroup>
    <Reference Include="info1">
    <Aliases>i1</Aliases>
    </Reference>
    <Reference Include="info2">
    <Aliases>i2</Aliases>
    </Reference>
    </ItemGroup>
    
  2. プロセスの最後のステップとして extern エイリアスディレクティブを利用します。

    extern alias i1;
    extern alias i2;
    
    class Test {
      static void Main() {
        i1.information.info first = new i1.information.info();
        i2.information.info second = new i2.information.info();
      }
    }
    
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn