■DLLをロードする。
C#の場合、同じ"C#"で作成されたアセンブリ(DLLなりEXE)なりを
参照することで、公開されているメソッドを使うことができますが...
C++等で書かれた旧来のDLLをロードする際に、いろいろと問題が起こります。
基本的には、↓みたいに"Dllimport属性でDLLを指定することで使用可能です(´・ω・`)b
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr LoadLibrary(string lpFileName);
■問題はここからで。
DLLを動的にロードする関数が、.NET Frameworkには見当たらない…((;゜Д゜))
いろいろ調べてみたんですが、結局はWin32APIを使用してC++と同じようにロード
するしか方法がないみたいです。
以下適当なサンプル。
/// LoadLibrary()
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern int LoadLibrary(string lpFileName);
/// FreeLibrary()
[DllImport("kernel32", SetLastError = true)]
public static extern bool FreeLibrary(IntPtr hModule);
/// GetProcAddress()
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
/// "hogehoge.dll"のpublicメソッド
public delegate bool hogehogeFunc(string param1);
private void Test(){
/// DLLをロード
int moduleHandle = LoadLibrary("hogehoge.dll");
/// APIへのポインタを取得
IntPtr funcPtr = GetProcAddress(moduleHandle , "hogehogeFunc");
/// ポインタからdelegateへ変換
hogehogeFunc func1 =
(hogehogeFunc)Marshal.GetDelegateForFunctionPointer(
funcPtr, typeof(hogehogeFunc));
func1("パラメータだよー");
/// DLLの解放
FreeLibrary(moduleHandle);
}
■ビルドすらしていないのでアレですが。
細部は間違ってるかもしれませんが、だいたい↑みたいな感じかと。
あとは、エラー処理さえ入れてしまえばOK。
LoadLibrary()したら、必ずFreeLibrary()しなきゃならんのが非常に面倒(´・ω・`)
PR
- 2009/11/27(金) 01:48|
- 雑記。|
-
TrackBack(-) |
-
Comment:0