extern (C# リファレンス)
更新 : 2007 年 11 月
extern 修飾子は、外部で実装されるメソッドを宣言するために使用します。extern 修飾子は一般に、相互運用サービスを使用してアンマネージ コードを呼び出すときに、DllImport 属性と共に使用します。この場合、次の例に示すように、メソッドを static として宣言する必要もあります。
[DllImport("avifil32.dll")]
private static extern void AVIFileInit();
メモ : |
---|
extern キーワードでは、外部アセンブリのエイリアスも定義できます。これにより、単一アセンブリ内から 1 つのコンポーネントの複数バージョンを参照できます。詳細については、「extern エイリアス (C# リファレンス)」を参照してください。 |
abstract (C# リファレンス) 修飾子および extern 修飾子を一緒に使用して同一のメンバを修飾するのは、エラーです。extern 修飾子を使用すると、メソッドが C# コードの外部で実装されていることを意味します。一方、abstract 修飾子を使用すると、メソッドの実装がクラスには用意されていないことを意味します。
メモ : |
---|
extern キーワードの用法は、C++ の場合よりも制限されています。C++ のキーワードとの比較については、『C++ Language Reference』の「Using extern to Specify Linkage」を参照してください。 |
使用例
この例では、ユーザーの入力したメッセージがプログラムに受け取られ、メッセージ ボックスに表示されます。このプログラムは、User32.dll ライブラリからインポートされた MessageBox メソッドを使用します。
//using System.Runtime.InteropServices;
class ExternTest
{
[DllImport("User32.dll", CharSet=CharSet.Unicode)]
public static extern int MessageBox(int h, string m, string c, int type);
static int Main()
{
string myString;
Console.Write("Enter your message: ");
myString = Console.ReadLine();
return MessageBox(0, myString, "My Message Box", 0);
}
}
この例では、次の例で C# プログラム内から起動する C プログラムから DLL を作成します。
// cmdll.c
// Compile with: /LD
int __declspec(dllexport) SampleMethod(int i)
{
return i*10;
}
この例では、extern を例示するために、CM.cs および Cmdll.c という 2 つのファイルを使用します。この C ファイルは、例 2 で作成された外部 DLL です。これは C# プログラムで呼び出されます。
// 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));
}
}
SampleMethod() returns 50.
解説
プロジェクトをビルドするには
Visual C++ のコマンド ラインを使用して、Cmdll.c を DLL にコンパイルします。
cl /LD Cmdll.c
コマンド ラインを使用して CM.cs をコンパイルします。
csc CM.cs
これで、実行可能ファイル CM.exe が作成されます。このプログラムが実行されると、SampleMethod が値 5 を DLL ファイルに渡し、DLL は渡された値に 10 を乗算した値を返します。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
- 10.6.7 外部メソッド
参照
概念
参照
System.Runtime.InteropServices.DllImportAttribute