Visual Studio 混合项目调试

Posted

技术标签:

【中文标题】Visual Studio 混合项目调试【英文标题】:Visual Studio mixed projects debugging 【发布时间】:2018-03-22 13:18:41 【问题描述】:

我有一个主要基于 C# 项目的解决方案,但我偶尔需要使用用本机 C++ 编写的库。我解决这个问题的方法是拥有一个本机项目,它只是充当本机库的包装器,在这种情况下是 OpenCV(我知道我可以直接在 C# 中使用 EMGUCV,但根据我的经验,它有一些我想要的错误避免,无论如何这更像是一个概念证明)。然后我有一个引用本机包装器的 C++ CLR 项目,最后是一个引用 C++ CLR 项目的 C# 项目。 严格来说,我可以直接从 CLR 项目中引用 OpenCV,而不是使用本机包装器项目,但我想以这种方式组织它,既符合解决方案其余部分的组织方式,又因为我可能会在某些时候点想要有这个结构还有一个原因。

这种方法的第一个问题是我找不到让 Visual Studio 自动将本机包装器的 dll 包含在最终目标目录中的方法。从 CLR 项目引用本机项目可以完美地工作,从 C# 项目引用 CLR 项目没有问题,但是当我构建它时它不会运行,因为本机 dll 没有被带到最终目标。我通过添加一些构建后操作来复制本机 dll 和 pdb 文件来解决这个问题。这行得通,而且我能够毫无错误地运行代码。但是,我无法调试本机项目。我在 C# 项目和 CLR 项目中打断点,但不是本机项目。

我尝试过的:

在 C# 项目属性中,我启用了本机代码调试选项。 在 CLR 项目中,我将调试模式设置为混合。 在原生项目中我尝试了纯原生和混合调试模式 在我检查过的 C# 项目中允许不安全代码 在 Visual Studio 中的 tools->options->debugging->general 我尝试检查和取消选中使用本机兼容模式并抑制模块加载时的 jit 优化。 我尝试在单独的 Visual Studio 实例中打开本机项目,以将调试器附加到从整个解决方案运行的项目中,但我不允许这样做,因为解决方案调试器已附加到该项目。有人建议这样做,但没有解释如何做到这一点。

【问题讨论】:

您错过的唯一明显的事情是“使用托管兼容模式”复选框。必须为 C++/CLI 项目打开。还要关闭“只是我的代码”以确保。验证您是否可以在“输出”窗口中看到已加载的本机 DLL,并查看“调试”>“Windows”>“模块”窗口以验证调试器是否找到了它的 PDB 文件。 我在工具->选项中启用了使用托管兼容模式,不是每个项目都专门有一个吗?我找不到任何在输出或模块窗口中加载的本机 dll。不是 OpenCV dll,也不是我的。代码肯定正在运行,因为我正在输出一些确实显示的结果图像。 只有你启动的EXE项目的调试设置相关。没有看到 DLL 被加载当然是有问题的明确迹象。除了忘记启用非托管调试之外,没有任何提示为什么这不起作用。确保不要吞下异常。 【参考方案1】:

问题是我之前提到的 C# 项目本身就是一个被另一个 C# exe 项目调用的 dll。当我为此项目启用本机调试时,一切都按预期工作。

【讨论】:

以上是关于Visual Studio 混合项目调试的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio:std::string 的乱码调试监视?

在 Visual Studio 调试会话期间查找当前目录?

visual studio 2010问题修复

如何在 Visual Studio 中混合不同编译器版本的程序:?

web项目 在visual studio 输出窗口显示调试信息

在 Visual Studio 10 中调试 VC++ 6 项目