« アンマネージドDLLの動的リンク(2) | トップページ | 親コンテナを無効にしても子コントロールを灰色表示にしない方法 »

2010年10月20日 (水)

アンマネージドDLLの動的リンク(3)[最終回]

アンマネージドDLLの動的リンク(2)の続きです。前回、方法1or2による比較では、方法2の方が若干スマートに書ける、また UnmanagedLink クラスを使用すれば、かなり簡単に移植出来そうな事が判りました。
更に方法2は、標準的なやり方なので安心感もあります。

それともう一つ、方法1を使用した場合、VisualStudio からの実行(F5 による実行)では、MethodGen メソッド実行時に、VisualStudio の[出力]ウィンドウに以下の様なメッセージが出力されます。

[出力]ウィンドウへの表示自体は、別に問題ないのですが、これが結構オーバーヘッドが大きいらしく、自作の圧縮解凍アプリでは、起動に時間がかかります。なにせ、起動時に相当数の MethodGen メソッドを実行しています。しかも VisualStudio2003 の時は、起動時間が問題になる程ではなかったので、余計に気になります。
この余計な出力も、方法2であればないので、開発中のイライラ防止にも役立ちそうです。

ところで話は変わりますが、UnmanagedLink クラスは、1回目の記事でちょっと触れた捨てられたブログの「アンマネージド DLL を遅延バインディングで使用する」の方法で使用していた、SafeHandle クラスからの継承も考慮する必要がありそうです。

この継承元になる SafeHandle クラス、ここのブログ見て初めて知りました。知ったのも、この記事書き始めてからなので、当初は全く未検討だった内容です。
それはともかく、自分の C#2005 は Express Edition のせいか、SafeHandle クラスがヘルプになく、全く参照できないのは、ちょっと勘弁して欲しい、という感じです。WindowsAPI なんかのヘルプを省略するのはまだ許せるけど、使えるクラスまで参照出来なくするのはどうかと思います。

まあ、愚痴を言ってもしょうがないので、MSDNの SafeHandle クラスを見てみます。FreeLibrary は、プロテクトメソッド ReleaseHandle をオーバーライドして、ここで実行する様にしなければならない様です。しかし、実際に SafeHandle を継承したクラスを使用するときには、Dispose でこの ReleaseHandle が呼び出される(?)様です。
つまり、UnmanagedLink クラスを SafeHandle クラス継承を前提に書き換えても、前回サンプルソース程度の使用方法なら、特に変更する必要はないようです。

実際の移行対象となる圧縮解凍アプリでは、PInvokeMethodGen クラスに追加していた Enabled プロパティ を使用しているので、これを IsInvalid プロパティ使用に書き換える必要がありますが、使用箇所は限られているので、支障はなさそうです。

以上の事から、VS2005以降を使用する限り、方法1は止めて、方法2を使用した方が良さそうです。

« アンマネージドDLLの動的リンク(2) | トップページ | 親コンテナを無効にしても子コントロールを灰色表示にしない方法 »

C#研究」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: アンマネージドDLLの動的リンク(3)[最終回]:

« アンマネージドDLLの動的リンク(2) | トップページ | 親コンテナを無効にしても子コントロールを灰色表示にしない方法 »