ページ

2004年11月12日金曜日

PInvoke する DLL を Load/Unload する方法

PInvoke Library Load/Unload Behavior – Freeing Unmanaged Libraries より。


.NET で レガシーな DLL を使うときは PInvoke して使うことになるわけですが、PInvoke では一度 DLL を Load したら二度と Unload することはできません。これを無理やり Unload してしまう方法のようです。
なるほどぉ、PInvoke なメソッドを呼び出す直前に LoadLibrary しておいて、Unload したくなったら GetModuleHandleExA でハンドルを取ってやって FreeLibrary してしまうわけか。そのときに LoadLibrary と辻褄があうように FreeLibrary がゼロを返すまで繰り返し呼んでやると。


って、これはいくらなんでも強引過ぎやしないか?w
元記事でも 「まったくお勧めできない」 と書かれてますので注意w
詳しくは元記事を。






上記の記事からリンクされている Dynamic PInvoke より。


おぉ、.NET Framework 2.0 では Marshal.GetDelegateForFunctionPointer なんていうのが追加されるんですね。
これを使うと、Win32 API の LoadLibrary、GetProcAddress で取得した関数ポインタを delegate に変換できるみたい。なので、上記のような無茶をせずにごく自然に LoadLibrary、FreeLibrary ができるようになるわけか。
あと、元記事に 「今まで DllImport を使って指定してた PreserveSig だとかはいったいどうやって指定するんだ」 というするどい突っ込みがされていますが、これもきちんと UnmanagedFunctionPointerAttribute が追加されるので問題なしとのこと。

0 件のコメント:

コメントを投稿