WinRT: Debugowanie projektów C++ w C#

Od kilku dni użeram się z projektem WinRT C#/XAML, który korzysta z projektu WinRT C++. Ta sytuacja rodzi u mnie wiele problemów, z którymi sobię jakoś daję powoli radę. Jednym z WTF, na które natrafiłem to problem debugowania mieszanej solucji. A ponieważ ja ostatni raz w C++ pisałem dekadę temu to współczynnik WTF per minute mam wysoki.

C# vs C++

Jest projekt aplikacji WinRT C#/XAML, która ma referencję do biblioteki WinRT C++ (a dokładnie Windows Runtime Component w Visual C++).

winrt-mixed-solution

Poniżej przykładowa klasa w c++:

#pragma once

using namespace Windows::Foundation;

namespace CppWinRTComponentDll
{
    public ref class CalculatorSample sealed
	{
	public:
		int Add(int x, int y);
		int Sub(int x, int y);
		int Mul(int x, int y);
	};
}

A tutaj wywołanie powyższego z poziomu C#:

var calculator = new CalculatorSample();

var addResult = calculator.Add(10, 20);
var SubResult = calculator.Sub(20, 10);
var MultiplyResult = calculator.Mul(10, 20);

Z C# wywołuję metodę C++ i chciałbym to zdebugować np. ustawiając breakpoint w metodzie C++, lub wchodząc do niej przez F11 (Step into). Ale okazuje się, że „by default” to nie działa.

Rozwiązanie

Nalezy otworzyć właściwości projektu startowego (StartUp Project) czyli u mnie jest to C#. We właściwościach przejdź do zakładki Debug i na samym dole zmień Debugger type na Mixed (Managed and Native).

WinRT mixed solution