複数の DLL を使用する Windows アプリケーション (EXE) に取り組んでいます。開発は VCExpress 2005 (VC 8.0) で、C のみを使用しています。
LoadLibrary
これらの DLL の一部は、EXE によって読み取られる構成ファイルに従って 動的にロードされるプラグイン/アドオン/拡張機能です。
重要: アプリケーションは移植可能 (インストールせずに USB フラッシュ ドライブなどから実行できるという意味で) である必要があり、プラグイン DLL はアプリケーション EXE と同じフォルダーにない場合があります (従来の理由)。
MSVC6 では、これは簡単です。EXE と DLL をコンパイル、リンク、配布します。
MSVC8 では、C ランタイム ライブラリ (MSVCRT) が OS と共に配布されなくなったため、インストールされていることに依存することはできません。移植性の要件を満たすには、プライベート アセンブリを使用する必要があります。すべての EXE と DLL には、マニフェストが埋め込まれています。
私の問題:経由で読み込まれたプラグイン DLLLoadLibrary()
は、EXE のフォルダーにあるプライベート アセンブリを見つけられないため、Microsoft.VC80.CRT
アセンブリが winSxS にインストールされていない限り、それらを読み込もうとすると失敗します。
キャッチ: マニフェストがプラグイン DLL から削除されると、すべてが機能します。
私の質問:
問題のケースでは、Windows はアセンブリ検索シーケンスまたはダイナミック リンク ライブラリ検索順序のいずれにも従っていないようです。具体的には、アプリケーション (EXE) のロード元ではなく、DLL のロード元のパスでプライベート アセンブリを検索します。
アセンブリを DLL に隣接させ、現在のディレクトリを変更して (作業ディレクトリのケースに関連するものを除外するために) これを確認し、期待どおりの動作を得ようとしました。LoadLibrary
SxS で使用する場合、これが通常の動作であることを他の誰かが確認できますか?マニフェストがないと、DLLは、EXE のフォルダーで
msvcr80.dll
(アセンブリ マニフェストではなく) 検出される非 SxS ロード順序にフォールバックすると想定するのは正しいですか?Microsoft.VC80.CRT.manifest
(1) と (2) について私が正しければ、マニフェストを DLL から除外するだけで何を失うのでしょうか? 言い換えると、マニフェストを除外するだけで問題を解決できないのはなぜですか?