アプリケーション A と DLL B があり、どちらも VS2010 に組み込まれたアンマネージ C++ です。DLL B は COM サーバーです。A は、いくつかのメソッドとクラスに対して B への暗黙的な C++ リンケージを使用しますが、B に実装されているコクラスにも COM 経由でアクセスしています。登録済みの COM を使用している場合、これはすべて正常に機能しますが、A が登録なしの COM を介して B を使用している場合、奇妙な問題が発生します。
IDE 内から A を起動すると (F5 または Ctrl+F5)、B で実装されたコクラスを共同作成しようとすると、アプリケーションがクラッシュします。また、これをデバッグしようとすると、Visual Studio Debugger が単にコマンドを無視する場合があることにも気付きました。メソッドにステップインします。ソース コードと実際に実行しているものは、何らかの形で同期していないようです。
その後、最終的に問題の原因を突き止めました。アプリケーション A のデバッグ設定で、コマンドが $(TargetPath) に設定されています。$(TargetPath) は、"$(ProjectDir)..\bin\" に設定されたプロジェクトの出力ディレクトリを使用します。出力ディレクトリを「..」親ディレクトリ構文を含まない絶対パスに変更すると、指しているディレクトリがまったく同じであったとしても、問題は解決しました。
そこで何が起こっているのか説明できる人はいますか?私のアプリケーションが起動時に暗黙的な C++ リンケージを介して B.dll をロードし、登録不要の COM のマニフェストに依存アセンブリとしてリストするという事実と関係があるという漠然とした考えがあります。これにより、B dll が何らかの形で 2 回読み込まれる可能性がありますか? また、IDE 内から A を起動したときにのみこれが発生するのはなぜですか? コマンド ラインから A を起動する場合、パスに「..」を使用すると問題なく動作します。