アンマネージドDLLの読み込み


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

基本設計

C++やその他の言語で作成されたDLLは、CLIによる実装ではない(アンマネージドDLL)です。

DllImport属性を使ってインポートするDLLを選ぶ。シグネチャはAPIのリファレンスマニュアルを参考してください。
WindowsAPIで使用されている型とC#での型の対応表は次の項目を参照してください。

[DllImport("user32.dll")]
extern static int GetWindowText(IntPtr hWnd,StringBuilder lpStr,int nMaxCount);

型変換ルール

WindowsAPIの型名 C#および.NETの型名
Windows API C C# プリミティブ .NET Framework
HWND void * System.IntPtr
WPARAM unsigned int uint System.UInt32
LPARAM long int System.Int32
LRESULT long int System.Int32
HANDLE void * System.IntPtr
BYTE unsigned char byte System.Byte
SHORT short short System.Int16
WORD unsigned short ushort System.UInt16
INT int int System.Int32
LONG long
UINT unsigned int uint System.UInt32
DWORD unsigned long
ULONG unsigned long
BOOL int bool System.Boolean
CHAR char char System.Char
LPSTR char * System.Text.StringBuilder
LPWSTR wchar_t *
LPCSTR const char * string System.String
LPCWSTR const wchar_t *
FLOAT float float System.Single
DOUBLE double double System.Double

DLLの遅延ロードのサンプルコード

using System;
using System.Runtime.InteropServices;
 
public class UnManagedDll :IDisposable {
    [DllImport("kernel32")]
    static extern IntPtr LoadLibrary(string lpFileName);
    [DllImport("kernel32")]
    static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
    [DllImport("kernel32")]
    static extern bool FreeLibrary(IntPtr hModule);
 
    IntPtr moduleHandle;
 
    public UnManagedDll(string lpFileName) {
        moduleHandle = LoadLibrary(lpFileName);
    }
 
    public IntPtr ModuleHandle {
        get {
            return moduleHandle;
        }
    }
 
    public T GetProcDelegate<T>(string method) where T :class {
        IntPtr methodHandle = GetProcAddress(moduleHandle, method);
        T r = Marshal.GetDelegateForFunctionPointer(methodHandle, typeof(T)) as T;
        return r;
    }
 
    public void Dispose() {
        FreeLibrary(moduleHandle);
    }
}

次のように呼び出して使用する。

using System;
 
class Program {
    delegate int MessageBoxADelegate(IntPtr hWnd, string lpText, string lpCaption, uint uType);
 
    static void Main(string[] args) {
        using(UnManagedDll user32Dll = new UnManagedDll("user32.dll")) {
            MessageBoxADelegate MessageBoxA =
                user32Dll.GetProcDelegate<MessageBoxADelegate>("MessageBoxA");
 
            MessageBoxA(IntPtr.Zero, "テキスト", "キャプション", 0);
        }
    }
}

読んでいる本


Effective C#

QLOOKアクセス解析

ここを編集