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変更。  |