Использование отладки смешанного режима в управляемом unit test в Visual Studio 2013

У меня есть С# unit test в тестовой среде Visual Studio 2013, которая выполняет CLI и собственный код. Я хотел бы исследовать нативную часть кода при выполнении С# unit test. Однако запуск Test → Debug → All Tests запускает управляемый отладчик, поэтому точки останова в собственном коде не попадают, и я не могу отслеживать из С# → кода С++/CLI, как я могу, при запуске программы в режиме отладчика смешанного режима.

Например, этот код в моем unit test:

[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 ) ); 
}

Посмотрев параметры проекта для проекта unit test, все в Debug отключено, поэтому я не могу проверить Enable Native Code Debugging, что позволяет это поведение для нормальной программы.

Как я могу включить отладку в смешанном режиме или собственную отладку только при запуске VS С# unit test?

Ответы

Ответ 1

  • Перейдите на страницу свойств для проекта unit test (щелкните правой кнопкой мыши по проекту в обозревателе решений, затем выберите "Свойства" )
  • Перейдите на вкладку "Отладка" (четвертая сверху в списке слева)
  • Включен флажок "Включить отладку собственного кода"
  • Отладка unit test - вы можете установить точки останова как в собственном, так и в управляемом коде, и вы можете перейти на любой вид кода.

У меня была такая же проблема, как у вас, и я смог сделать это, используя эти шаги. Прежде чем включить этот флажок, это не сработало. Для записи я использую обновление VS2013 4.

enter image description here

Ответ 2

Я не знаю, как отлаживать собственный код в VS. Если вы хотите понять, почему два объекта не равны, вам нужно проверить, какое сравнение происходит для этого "равного" вызова.

попробуйте прочитать это: https://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx

так как MyCLIObject не является тем же типом, что и RoundtripXml, если сравнение в MyCLIObject не ищет тип RoundtripXml, я бы ожидал, что он всегда вернет false.

вы можете позвонить:

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

то посмотрите, что происходит в версии класса RoundtripXml Equals() (предполагая, что это не cpp/native).