1

vs2010(.net 4.0)でアプリを作りました。パブリッシャーと InstallShield LE の両方を使用して公開しました。

しかし、アプリケーションを実行すると、 adllが見つからないというエラーが発生します。どのdllが欠落しているかはわかっています。これは非 COM オブジェクトで、vs2010 のプロジェクトに追加できません。この dll を呼び出すラッパー ライブラリを使用しています。

それを に貼り付けるとdllsyswow64アプリケーションは正常に動作します。しかし、私はそれを行うよりクリーンな方法が欲しいです。私はすでにハンスの答えをここで見ました。しかし、サイドバイサイドキャッシュとは何かわかりません。

環境変数へのパスの追加も正常に機能します。

レジストリの更新とパス値の追加が機能するかどうかはわかりません。アプリケーションのレジストリを更新して、特定の dll を検索するパスを指定できるかどうかを知りたいです。

ありがとう。

4

2 に答える 2

1

ユーザーのPATH変数を変更することは非常に重い解決策であり、避けるべきです。同様に、DLL をシステム ディレクトリに配置しないでください。それはシステムに属し、あなただけのものです。

この問題を解決するための推奨される方法は、単純に DLL を実行可能ファイルと同じディレクトリに置くことです。ロードされた が DLL を見つけようとするときに、実行可能ファイルが存在するディレクトリが最初に検索されます。ネイティブ DLL を配置するのに最も安全な場所です。

何らかの理由で DLL を実行可能ディレクトリに配置できない場合は、他のオプションがあります。

  • SetDllDirectory最初の p/invoke 呼び出しを行う前に、DLL のディレクトリで呼び出します。その呼び出しが返されたら、呼び出しSetDllDirectoryを渡しNULL、既定の DLL 検索順序を復元します。
  • LoadLibrary最初の p/invoke 呼び出しを行う前に、DLL のフル パスを使用して を明示的に呼び出します。DLL がロードされると、以降の p/invoke 呼び出しでは、ロードされたモジュールが使用されます。
于 2013-10-02T09:50:02.967 に答える
0

DLL 名があらかじめわかっている場合は、簡単な方法があります。

LoadLibrary を使用して、既知の場所 (構成ファイルのエントリなどに基づく) から DLL をロードするだけです。

いずれかの DLL メソッドが使用される前に LoadLibrary を正常に呼び出す限り、DLL は既に読み込まれているため、これは成功します。

これが機能するのは、完全パスで LoadLibrary を使用できるためです。これが完了すると、ライブラリが既にロードされているため、ファイル名だけを使用した LoadLibrary への後続の呼び出しはすぐに成功します。

于 2013-10-02T09:51:08.417 に答える