2

アンマネージ dll を C# にインポートするアプリケーションに取り組んでいます。メソッドをロードして呼び出すことができるラッパークラスがあります。メソッドは、dll のプログラムで正常に動作します。使用しているdllのバージョンを保存する機能を追加したいです。FileVersionInfo.GetVersionInfo("my.dll") を使用する必要があることがわかりましたC# が管理されていない dll のバージョンを取得しているためです。ただし、この関数を実行すると、「my.dll」が見つからないという例外が発生します。dll は、c: のルートから離れたフォルダーにあります。このフォルダーは PATH にあり、http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx#search_order_for_desktop_applications によると、それが見つかるはずです。

my.dll ファイルが読み込まれて動作していることを知っているのに、同じラッパー クラス内で GetVersionInfo() を呼び出して my.dll を見つけて、同じファイルのバージョン番号を取得できないのはなぜですか? 数日間探していたので、助けてくれてありがとう。

4

2 に答える 2

1

フルパスが必要で、DLL を検索しません。これはリスクが高すぎます。DLL に対する Windows の検索規則は複雑で、構成が必要です。関数をピンボークする前にこれを行う必要がある場合、最良の方法は SearchPath() をピンボークすることです。最初の引数を null に設定した場合に LoadLibrary が使用するのと同じアルゴリズムを使用します。

関数をピンボークした後にこれを行う必要がある場合は、ロードされた DLL を使用するのが最善の方法です。Process.GetCurrentProcess().Modules を繰り返して、ProcessModule.FileName を取得します。

于 2012-06-18T19:36:09.180 に答える
1

MSDN によると、GetVersionInfo のパラメーターは次のとおりです。

バージョン情報を取得するファイルの完全修飾パスと名前。

ですから、それはかなり明確です。この関数はフル パスに依存しているように見えるため、フル パスを渡す必要があります。それ以外の場合は、現在のディレクトリ (アプリのディレクトリ) でファイルを検索する可能性が高くなります。

補足として、ネイティブ DLL を C:\ に保持することは悪い習慣です。アプリケーションのフォルダに保存する必要があります。その後、この関数が機能し、アプリはより自己完結型になります。ディスク上に広がるファイルはありません。もちろん、C ドライブのルートに保存する正当な理由がない限り、これは当てはまります。

于 2012-06-18T19:01:19.273 に答える