Приложение WinUI 3 стабильно работает в режиме отладки, но аварийно завершает работу при сборке в режиме выпуска. Ниже представлена информация об ошибке.

В обычной разработке я редко сталкиваюсь с подобными странными неполадками. WinUI 3 чаще всего генерирует внутренние исключения времени выполнения, из-за чего сложно найти полезные подсказки в стеке исключений.
После ряда проверок и исключений я выяснил, что сбой вызывается нулевой ссылкой, возникающей при инициализации ViewModel внутри страницы. Структура проекта следующая: главное окно с боковым навигационным меню. При нажатии на пункты меню целевые страницы загружаются в основную область контента справа. Фрагмент кода XAML, используемый в главном окне:
<TabView Name="tabView" IsAddTabButtonVisible="False" Margin="10" VerticalAlignment="Stretch" TabCloseRequested="TabView_TabCloseRequested">
<TabViewItem x:Uid="tabConsonant" Name="tvHome">
</TabViewItem>
</TabView>Code language: HTML, XML (xml)
Этот элемент TabView отображает страницы контента в правой части окна. Я присваиваю экземпляр целевой страницы элементу tvHome через серверный код:
private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
tvHome.Content = new ConsonantsPage();
}Code language: JavaScript (javascript)
Дополнительная отладка подтвердила, что аварийное завершение происходит именно на строке this.DataContext = vm; внутри целевой страницы.

Затем я протестировал пустую страницу без DataContext и привязки данных, которая загрузилась без каких-либо ошибок. Таким образом, основная причина определенно связана с логикой привязки XAML. Вместо стандартной привязки MVVM я использовал временное решение: создавать элементы интерфейса программно напрямую в серверном коде.
Итоговое рабочее решение:
Создание элементов управления и привязка значений полностью через код C# на стороне сервера:
public TonePage()
{
InitializeComponent();
Loaded += Page_Loaded;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var toneData = ThaiAlphabetSource.Tones;
FillToneGrid(gvToneList, toneData);
}
private void FillToneGrid(GridView grid, List<ToneInfo> source)
{
foreach (var item in source)
{
Button btnRoot = new Button
{
HorizontalContentAlignment = HorizontalAlignment.Center,
VerticalContentAlignment = VerticalAlignment.Center,
Tag = item.Audio
};
btnRoot.Click += PlayClick;
StackPanel sp = new StackPanel
{
Width = 240,
Orientation = Orientation.Vertical,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
TextBlock tbTitle = new TextBlock
{
HorizontalContentAlignment = HorizontalAlignment.Center,
FontSize = 50,
Foreground = new SolidColorBrush(Color.FromArgb(0xFF, 0x01, 0xA0, 0xC7)),
Text = item.Letter_Title
};
TextBlock tbName = new TextBlock
{
HorizontalContentAlignment = HorizontalAlignment.Center,
FontSize = 30,
Text = item.Letter_Name
};
TextBlock tbScript = new TextBlock
{
HorizontalContentAlignment = HorizontalAlignment.Center,
FontSize = 30,
Text = item.Letter_Script
};
sp.Children.Add(tbTitle);
sp.Children.Add(tbName);
sp.Children.Add(tbScript);
btnRoot.Content = sp;
grid.Items.Add(btnRoot);
}
}Code language: PHP (php)
Я не стал детально разбирать первопричину ошибки, но предполагаю, что проблема возникает из-за синтаксиса привязки команд, такого как Command="{Binding PlayCommand}". Это предположение подтверждает другой тест: страницы, использующие только привязку свойств без привязки команд, работают стабильно, как показано ниже.
<Button Content="{Binding}" Grid.Row="0" Grid.Column="1" BorderBrush="#ccc" Foreground="Black" FontSize="50" Height="100" Width="130" Click="Button_Click"/>Code language: HTML, XML (xml)
Данный вариант нормально работает в конфигурации выпуска.