トップ回答者
DllImportによるアンマネージDLLの読み込みについて

質問
-
個人的によく利用するAPIのDLLの呼び出しを、面倒なので都度コードするのではなく、マネージコンパイルされた1DLL内などで一元管理してしまおうかと思っています。
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
が、上記のようにDllImportして呼び出しを行うことによって、アプリケーションを終了するまで解放されなくなるみたいです。
(それを特段問題視する場面があるのかというのも不明なんですが)そこで、Marshal.GetDelegateForFunctionPointer を利用して動的に読み込み、不要になったら解放するという方法論はどうかと考えました。
(LoadLibrary、GetProcAddress、FreeLibraryは、諦めて、常に読み込みを行うという方法で)
呼び出し速度も、今のところ、乱発するような場面には遭遇していませんので、体感するほど遅くなければひとまずOKだと考えています。アンマネージDLLを呼び出すとき、みなさんどのようにしているでしょうか?
どうせコード方法が決まり切ってくるなら、必要になる度にコードする(コピペも含む)という手間を省略したいと思ったのですが。
定石、もしくはよりベターだと考えられる方法論などをご教示いただけたら幸いです。
回答
-
DLLをアンロードすることにどれほどの意義を見出しているか、ではないでしょうか?
DLLをロードしたままであっても未使用でメモリ不足であれば順次メモリ割り当てからは外されていき(ページアウト)、再使用時にはディスクから読み込まれるわけで(ページイン)。私はそれで困っていませんし、.NETもその方針ということです。
ついでに言うとkernel32.dllなんてアンロードできるような代物じゃないです。CloseHandle()とかありますので。
すべての返信
-
DLLをアンロードすることにどれほどの意義を見出しているか、ではないでしょうか?
DLLをロードしたままであっても未使用でメモリ不足であれば順次メモリ割り当てからは外されていき(ページアウト)、再使用時にはディスクから読み込まれるわけで(ページイン)。私はそれで困っていませんし、.NETもその方針ということです。
ついでに言うとkernel32.dllなんてアンロードできるような代物じゃないです。CloseHandle()とかありますので。