C#からネイティブコード(C言語、C++等)の関数を呼ぶ場合、 C#側で"System.Runtime.InteropServices.DllImport"属性を指定して、その関数と同様のメソッドを宣言します。 DllImport属性を指定して宣言すると、ネイティブコードの関数を、通常のメソッドのように、C#から呼び出せるようになります。
今回は、C#のコンソールアプリから、WIN32APIのGetComputerName()を呼んでみます。 GetComputerName()は、ローカルコンピュータのNetBIOS名を取得するAPIで、Kernel32.dllにあります。
開発環境と主な手順は、以下のようになります。
▽ 開発環境
OS: WindowsXP Professional C#コンパイラ: Visual C# 2005 Express Edition
▽ 主な手順
① VC#で新規プロジェクト(コンソール アプリケーション)を作成する。 ② DllImport属性を指定して、GetComputerName()を宣言する。 ③ ②のGetComputerName()を呼び、コンピュータ名を取得し、表示する。
◆ 開発
① VC#で新規プロジェクト(コンソール アプリケーション)を作成する。
今回は、プロジェクト名を"DllImportTest"にしています。
② DllImport属性を指定して、GetComputerName()を宣言する。
DllImport属性は、下記、ソース(Program.cs)の青字部分のように指定します。 メソッドの宣言は、WIN32APIと.NET(C#)で、変数の型名が異なるので、以下のように一致させる必要があります。
◇ WIN32API
BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD lpnSize);
◇ .NET(C#)
public static extern bool GetComputerName(StringBuilder buffer, ref uint size);
または
static extern unsafe bool GetComputerName(byte* lpBuffer, long* nSize);
WIN32APIと.NET(C#)での型の違いは、PINVOKE.NET で調べられます。
PINVOKE.NET: http://pinvoke.net/
[ Program.cs ]
using System;
using System.Collections.Generic;
using System.Text;
namespace DllImportTest
{
class Program
{
// DllImport属性をしてメソッドを宣言
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool GetComputerName(StringBuilder buffer, ref uint size);
static void Main(string[] args)
{
StringBuilder buffer = new StringBuilder(256);
uint size = 256;
// API呼び出し
if (GetComputerName(buffer, ref size))
{
// コンピュータ名を表示
System.Console.WriteLine("Computer name: {0}", buffer.ToString());
}
else
{
System.Console.WriteLine("GetComputerName() - error");
}
}
}
}
③ ②のGetComputerName()を呼び、コンピュータ名を取得し、表示する。
②で宣言したGetComputerName()を、赤字部分のように呼び、コンピュータ名を取得します。 最後に、WriteLine()メソッドで、コンピュータ名を表示して終了です。
DllImport属性を使ってメソッドを宣言すれば、WIN32APIでも通常のメソッドとして呼べるようになります。
- 以上 -
編集履歴 [2007/05/19] 新規作成。 [2007/07/14] 誤植修正。 [2008/08/29] レイアウトを修正。 [2009/01/--] サイト移転。レイアウト変更。 [2010/03/10] サイト移転。レイアウト変更。 [2010/07/04] URL変更。 |