extern (C# リファレンス)
extern
修飾子は、外部で実装されるメソッドを宣言するために使用します。 extern
修飾子は一般に、相互運用サービスを使用してアンマネージ コードを呼び出すときに、DllImport
属性と共に使用します。 この場合、次の例に示すように、メソッドを static
として宣言する必要もあります。
[DllImport("avifil32.dll")]
private static extern void AVIFileInit();
extern
キーワードでは、外部アセンブリのエイリアスも定義できます。これにより、単一アセンブリ内から 1 つのコンポーネントの複数バージョンを参照できます。 詳細については、「extern エイリアス」を参照してください。
abstract 修飾子および extern
修飾子を一緒に使用して同一のメンバーを修飾すると、エラーになります。 extern
修飾子を使用すると、メソッドが C# コードの外部で実装されていることを意味します。一方、abstract
修飾子を使用すると、メソッドの実装がクラスには用意されていないことを意味します。
extern キーワードの C# での用法は、C++ の場合よりも制限されています。 C# のキーワードと C++ のキーワードを比較するには、C++ 言語リファレンスの「extern を使用したリンケージの指定」を参照してください。
例 1
この例では、ユーザーの入力したメッセージをプログラムが受け取って、メッセージ ボックスに表示します。 このプログラムは、User32.dll ライブラリからインポートされた MessageBox
メソッドを使用します。
//using System.Runtime.InteropServices;
class ExternTest
{
[DllImport("User32.dll", CharSet=CharSet.Unicode)]
public static extern int MessageBox(IntPtr h, string m, string c, int type);
static int Main()
{
string myString;
Console.Write("Enter your message: ");
myString = Console.ReadLine();
return MessageBox((IntPtr)0, myString, "My Message Box", 0);
}
}
例 2
この例は、C ライブラリ (ネイティブ DLL) を呼び出す C# プログラムを示しています。
次の C ファイルを作成し、
cmdll.c
という名前を付けます。// cmdll.c // Compile with: -LD int __declspec(dllexport) SampleMethod(int i) { return i*10; }
Visual Studio のインストール ディレクトリから Visual Studio x64 (または x32) Native Tools コマンド プロンプト ウィンドウを開き、コマンド プロンプトで「cl -LD cmdll.c」と入力して、
cmdll.c
ファイルをコンパイルします。同じディレクトリに、次の C# ファイルを作成し、
cm.cs
という名前を付けます。// cm.cs using System; using System.Runtime.InteropServices; public class MainClass { [DllImport("Cmdll.dll")] public static extern int SampleMethod(int x); static void Main() { Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5)); } }
Visual Studio のインストール ディレクトリから Visual Studio x64 (または x32) Native Tools コマンド プロンプト ウィンドウを開き、次のように入力して
cm.cs
ファイルをコンパイルします。csc cm.cs (x64 コマンド プロンプトの場合) または csc -platform:x86 cm.cs (x32 コマンド プロンプトの場合)
これで、実行可能ファイル
cm.exe
が作成されます。cm.exe
を実行します。SampleMethod
メソッドは、DLL ファイルに値 5 を渡します。DLL は 10 で乗算した値を返します。 このプログラムの出力は、次のようになります。SampleMethod() returns 50.
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET