C# 入門 & 実践 / C sharp

101. アンマネージ DLL の使用 - 2 - DllImportAttribute


DllImportAttribute を使用して、DLLのメソッドを使用します。
とりあえず
http://msdn2.microsoft.com/ja-jp/library/42b9ea93.・・・
にあるのと同じく MessageBoxを利用してみたいと思います。

DllImport と extern 修飾子 が重要なポイントですね。
extern 修飾子 は、メソッドがアンマネージコードである時に使用します。

// InteropServices を宣言
using System.Runtime.InteropServices;

    public class Win32
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr MessageBox(int hWnd, String text,
                        String caption, uint type);
    }

    class Program
    {
        static void Main(string[] args)
        {
            Win32.MessageBox(0, "テスト中~", "Platform  Invoke  Sample", 0);
        }
    }



CharSet.Auto にしているので、日本語というかUNICODEでそのまま使えました。

元のMessageBox
int MessageBox( HWND hWnd,PCTSTR pszText,PCTSTR pszCaption, UINT uType);

.Net用
public static extern IntPtr MessageBox(int hWnd, String text,String caption, uint type);

とこのように書き換えているのですが、
基本的なデータ型は以下のように置き換えられます。
http://msdn2.microsoft.com/ja-jp/library/ac7ay120.・・・
HANDLE:void* → IntPtr
BYTE:unsigned char → Byte
LPCSTR:const char* → Stringまたは StringBuilder
という感じです。

各種のマーシャリングをあとで見て行きたいと思います。
文字列、参照渡し、配列、構造体、コールバック関数

その前に、

関数名の変更


エントリポイントを指定することにより、関数名を変更することが出来ます。

        [DllImport("user32.dll",EntryPoint="MessageBox",CharSet = CharSet.Auto)]
        public static extern IntPtr myMsg(int hWnd, String text,
                        String caption, uint type);



101. アンマネージ DLL の使用 - 1 - マネージコードとアンマネージコード - extern 修飾子 « 101. アンマネージ DLL の使用 » 101. アンマネージ DLL の使用 - 3 - 文字列、参照渡し

C# 入門 & 実践 / C sharp