Использование отладки смешанного режима в управляемом 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).