【问题标题】:Using mixed-mode debugging on a managed unit test in Visual Studio 2013在 Visual Studio 2013 中对托管单元测试使用混合模式调试
【发布时间】:2015-02-23 08:57:56
【问题描述】:

我在 Visual Studio 2013 测试框架中进行了 C# 单元测试,该测试框架使用 CLI 和本机代码。我想在执行 C# 单元测试时调查代码的本机部分。但是运行测试->调试->所有测试运行托管调试器,因此不会命中本机代码中的断点,并且我无法像在混合模式调试器下运行程序时那样从 C#->C++/CLI 代码跟踪。

例如,我的单元测试中的这段代码:

[TestMethod]
public void TestRoundTripEvaluate()
{
     var obj = new MyCLIObject();
     var roundtripped = RoundtripXml( obj );

     // I would like to trace into here to see why Equals returns false.
     // But the definition for MyCLIObject is in a CPP file and cannot be navigated 
     // to running the unit test because Visual Studio starts the debugger as "managed only"
     // when using Test -> Debug -> All Tests
     Assert.IsTrue( obj.Equals( roundtripped ) ); 
}

查看单元测试项目的项目设置,Debug下的一切都被禁用了,所以我不能选中Enable Native Code Debugging,它允许正常程序的这种行为。

如何在运行 VS C# 单元测试时启用混合模式调试或仅本机调试?

【问题讨论】:

  • 我正在使用 vs2013 update 4 并且“启用本机代码调试”复选框可用。你用的是哪个版本的VS?

标签: c# unit-testing visual-studio-2013 mixed-mode


【解决方案1】:

我不知道在 VS 中调试本机代码的方法。如果您想了解为什么两个对象不相等,您需要检查“equals”调用发生的比较。

尝试阅读:https://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx

由于MyCLIObjectRoundtripXml 的类型不同,除非MyCLIObject 中的比较正在寻找RoundtripXml 的那种类型,我希望它总是返回false

你可以打电话:

Assert.IsTrue( roundtripped.Equals(obj) ); 

然后查看 RoundtripXml 类的 Equals() 版本中发生了什么(假设它不是 cpp/native)。

【讨论】:

    【解决方案2】:
    1. 转到单元测试项目的属性页面(在解决方案资源管理器中右键单击项目,然后单击“属性”)
    2. 转到“调试”选项卡(左侧列表中的倒数第 4 个)
    3. 启用“启用本机代码调试”复选框
    4. 调试您的单元测试 - 您可以在本机或托管代码中设置断点,并且可以单步执行任何一种代码。

    我刚刚遇到了和你一样的问题,并且能够使用这些步骤使其正常工作。在启用此复选框之前,它不起作用。 作为记录,我使用的是 VS2013 更新 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      相关资源
      最近更新 更多