Использование отладки в смешанном режиме в тесте управляемого модуля в Visual Studio 2013
У меня есть модульный тест C# в тестовой среде Visual Studio 2013, который использует CLI и собственный код. Я хотел бы исследовать нативную часть кода во время выполнения модульного теста C#. Однако при запуске Test -> Debug -> All Tests запускается управляемый отладчик, поэтому точки останова в нативном коде не удаляются, и я не могу отследить код 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 ) );
}
Глядя на настройки проекта для проекта модульного теста, все в разделе "Отладка" отключено, поэтому я не могу установить флажок "Включить отладку собственного кода", что позволяет такое поведение для обычной программы.
Как включить отладку в смешанном режиме или отладку только в собственном режиме при выполнении модульного теста VS C#?
2 ответа
- Перейдите на страницу свойств вашего проекта модульного тестирования (щелкните правой кнопкой мыши проект в обозревателе решений, затем нажмите "Свойства")
- Перейдите на вкладку "Отладка" (4-й сверху в списке слева)
- Включен флажок "Включить отладку собственного кода"
- Отладка вашего модульного теста - вы можете установить точки останова как в собственном, так и в управляемом коде, и можете перейти к любому виду кода.
У меня была та же проблема, что и у вас, и я смог заставить ее работать с помощью этих шагов. До включения этого флажка он не работал. Для записи я использую VS2013 обновление 4.
Я не знаю способ отладки нативный код в 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).