none
DllImportによるアンマネージDLLの読み込みについて RRS feed

  • 質問

  • 個人的によく利用する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を呼び出すとき、みなさんどのようにしているでしょうか?
    どうせコード方法が決まり切ってくるなら、必要になる度にコードする(コピペも含む)という手間を省略したいと思ったのですが。
    定石、もしくはよりベターだと考えられる方法論などをご教示いただけたら幸いです。

    2014年11月25日 1:57

回答

  • DLLをアンロードすることにどれほどの意義を見出しているか、ではないでしょうか?

    DLLをロードしたままであっても未使用でメモリ不足であれば順次メモリ割り当てからは外されていき(ページアウト)、再使用時にはディスクから読み込まれるわけで(ページイン)。私はそれで困っていませんし、.NETもその方針ということです。

    ついでに言うとkernel32.dllなんてアンロードできるような代物じゃないです。CloseHandle()とかありますので。

    • 回答の候補に設定 星 睦美 2014年11月25日 2:59
    • 回答としてマーク takiru 2014年11月25日 3:06
    2014年11月25日 2:17

すべての返信

  • DLLをアンロードすることにどれほどの意義を見出しているか、ではないでしょうか?

    DLLをロードしたままであっても未使用でメモリ不足であれば順次メモリ割り当てからは外されていき(ページアウト)、再使用時にはディスクから読み込まれるわけで(ページイン)。私はそれで困っていませんし、.NETもその方針ということです。

    ついでに言うとkernel32.dllなんてアンロードできるような代物じゃないです。CloseHandle()とかありますので。

    • 回答の候補に設定 星 睦美 2014年11月25日 2:59
    • 回答としてマーク takiru 2014年11月25日 3:06
    2014年11月25日 2:17
  • DLLをアンロードすることにどれほどの意義を見出しているか、ではないでしょうか?

    ご回答ありがとうございます。
    やはり、そういう位置づけになりますかね。
    特定アプリケーション開発下において、OS搭載DLLというよりは、ベンダーや自作のアンマネージDLLを扱う場面で、そのDLLをどう取り扱うか、で初めて考える感じでしょうか。

    今のところ個人的には、遅延バインディングも別に求めてないし、素直にDllImportするだけでよさそうです。
    ありがとうございました。

    2014年11月25日 2:47