6

この属性を使用し[DllImport]てネイティブ DLL をアプリケーションにインポートしていますが、ロードしている DLL がローカルの bin フォルダーにありません。システムの別の場所からロードされていますが、どこにあるのかわかりません。

私の開発マシンでは動作しますが、クリーンなマシンでは動作しません。

Fusion ログを有効にしましたが、管理されたアセンブリのみが表示されます。

Sysinternals Process Explorer を使用してプロセスをダンプしましたが、プロセスが含まれているとC:\Windows\System32表示されますが、Windows エクスプローラーでファイルが表示されません。

私は64ビットのWindows 7を実行していますが、DLLはx86のみをサポートしているため、アプリを強制的にx86にする必要があったことに注意してください。x86 ファイルのロード元を変更する何らかのリダイレクトはありますか?

DllImport は、Silicon Labs のカスタム USB ドライバーです。[DllImport("SiUSBXp.dll")]

また、コマンド プロンプトを使用しdir si*て System32 フォルダーで実行しましたが、ファイルがありません。

4

4 に答える 4

4

ファイル システム リダイレクターが起動します。

%windir%\System32 ディレクトリは、64 ビット アプリケーション用に予約されています。ほとんどの DLL ファイル名は、64 ビット バージョンの DLL が作成されたときに変更されていないため、32 ビット バージョンの DLL は別のディレクトリに格納されます。WOW64 は、ファイル システム リダイレクタを使用してこの違いを隠します。

ほとんどの場合、32 ビット アプリケーションが %windir%\System32 にアクセスしようとすると、アクセスは %windir%\SysWOW64 にリダイレクトされます。

そのため、プロセスは から DLL をロードしたと考えていても、System32おそらく からロードされていると考えられSysWOW64ます。

于 2012-12-19T10:39:46.627 に答える
2

DllImport の背後にある実際のソース コードは次のとおりです。

https://github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/dllimport.cpp

ご覧のとおり、最初に .Net の内部キャッシュで管理されていないライブラリを見つけようとします。

それが失敗しても、絶対パスが指定されている場合は、そのパスでライブラリをロードします。

絶対パスが指定されていない場合、次の場所が検索されます。

1) DllImport を含むアセンブリのマニフェスト ファイルを含むフォルダー。

2) Assembly.CodeBase で指定されたフォルダー。

3) LoadLibraryExW が参照するすべての場所。

すべてが失敗した場合、「ファイル名、アセンブリ名」として解釈しようとします。

次に、ライブラリを内部キャッシュに追加します。

于 2014-11-03T08:31:18.273 に答える
1

この - LoadLibrary 関数を読み取り、そこから、このDynamic Link Library Search Orderも読み取りたいとします。

注 - これらはネイティブの Win32 API に関連していますが、これは[DllImport]属性によって使用される API です。

すべてのファイルを表示をオンにする必要があるため、ファイルがエクスプローラーに表示されない可能性があります。多くの一般的な[DllImport]ディレクティブ (例: kernel32) は、オペレーティング システム ファイルとして分類され、デフォルトで非表示になっている Win32 DLL をターゲットにしています。

于 2012-12-19T10:28:59.017 に答える
1

DLLImport次のパスを検索します。

  1. 現在読み込まれている DLL (既に読み込まれている場合は、ファイルを検索する必要はありません)
  2. 現在のプロセスの実行可能モジュールのディレクトリ
  3. 現在のディレクトリ。
  4. 「システム」ディレクトリ。(つまり、c:\Windows\System32)
  5. 「Windows」ディレクトリ。(つまり、c:\Windows)
  6. PATH 環境変数にリストされているディレクトリー。
于 2012-12-19T10:29:19.340 に答える