我有一个应用程序 A 和一个 DLL B,它们都是在 VS2010 中构建的非托管 C++。DLL B 是一个 COM 服务器。对于某些方法和类,A 使用与 B 的隐式 C++ 链接,但它也通过 COM 访问在 B 中实现的 coclass。这在使用注册 COM 时一切正常,但是当 A 通过免注册 COM 使用 B 时,出现了一个奇怪的问题。
当我从 IDE(F5 或 Ctrl+F5)中启动 A 时,我的应用程序在尝试共同创建在 B 中实现的 coclass 时崩溃。我还注意到,当我尝试调试它时,Visual Studio 调试器有时会忽略我的命令进入方法。源代码和实际执行的代码似乎不同步。
然后我最终找到了问题的原因:在应用程序 A 的调试设置命令中设置为 $(TargetPath)。$(TargetPath) 反过来使用项目的输出目录,该目录设置为“$(ProjectDir)..\bin\”。将输出目录更改为不包含“..”父目录语法的绝对路径,解决了问题,即使指向的目录完全相同。
谁能解释那里发生了什么?我有一个模糊的想法,这与我的应用程序在启动时通过隐式 C++ 链接加载 B.dll 并且还在其清单中将其列为依赖程序集以用于免注册 COM 的事实有关。这会导致 B dll 以某种方式被加载两次吗?为什么只有在从 IDE 中启动 A 时才会发生这种情况?从命令行启动 A 时,在路径中使用“..”可以正常工作。