C# からでも Win32 API を使う事がたびたびあるのですが,そのときに困るのが「どう宣言すればいいんだろう」と言うものでした.そこでいろいろとググっていたのですが,pinvoke.net と言うサイトが Win32 API の .NetFramework での宣言をかなり網羅していました.例えば,FindFirstFile と言う Win32 API だと以下のような感じになります.
C# Signature:
[DllImport("kernel32.dll", CharSet=CharSet.Auto)] static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);VB.NET Signature:
<DllImport("kernel32.dll", CharSet := CharSet.Auto)> _ Private Shared Function FindFirstFile(ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As IntPtr End Functionpinvoke.net: FindFirstFile (kernel32)User-Defined Types:
尚,サンプルコードをいろいろ見ていたのですが,C# で Win32 API を宣言する場合,クラス内で NativeMethods と言うクラスを定義してその中に纏めると言う形がよく用いられるようです.
using System; using System.Runtime.InteropServices; public class Foo { internal class NathiveMethods { [DllImport("kernel32.dll", CharSet=CharSet.Auto)] public static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData); } public void Bar() { ... NathiveMethods.FindFirstFile(...); ... } }