C# の extern キーワード
今日の記事では、C# での extern
キーワードの機能について学習します。
C#
の extern
外部実装メソッドの宣言は、extern
修飾子を使用して行われます。Interop
サービスを利用してアンマネージコードを呼び出す場合、extern
修飾子は DllImport
属性と組み合わせて使用されることがよくあります。
この状況では、メソッドを static
として定義する必要があります。
extern
キーワードを使用して外部アセンブリエイリアスを作成し、同じコンポーネントの複数のバージョンを単一のアセンブリ内で参照できるようにすることもできます。
abstract
と extern
の両方の修飾子を同時に使用して単一のメンバーを変更することは許可されていません。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つの別々のアセンブリから発生した場合にのみ発生する可能性があります。
-
info1.dll
にコンパイルされた最初のライブラリnamespace information { public class info {} }
-
info2.dll
にコンパイルされた 2 番目のライブラリnamespace information { public class info {} }
-
以下は、
info1.dll
およびinfo2.dll
ファイルを使用するアプリケーションの例です。using info; class Test { static void Main() { information i = new information(); } }
-
information
が明確でないため、アプリケーションをコンパイルできません。この状況では、extern
エイリアスを使用して不確実性を解消できます。まず、アプリケーションが使用する
.csproj
ファイルを変更し、各参照に個別のalias
を指定する必要があります。<ItemGroup> <Reference Include="info1"> <Aliases>i1</Aliases> </Reference> <Reference Include="info2"> <Aliases>i2</Aliases> </Reference> </ItemGroup>
-
プロセスの最後のステップとして
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(); } }
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