Skip to content

Build: perf_bench XAML projects fail on ARM64 — XamlCompiler.exe exits with code 1 (MSB3073) #678

Description

@azchohfi

Summary

dotnet build Reactor.slnx -c Release fails on an ARM64 host (the default arch on an ARM64 dev box) for the XAML-bearing tests/perf_bench/** harness projects. The WinUI XAML markup compiler — the net472 XamlCompiler.exe shipped in Microsoft.WindowsAppSDK.WinUI 2.0.12 — exits with code 1 and MSBuild surfaces only MSB3073, with no further diagnostic in the log:

C:\Users\<user>\.nuget\packages\microsoft.windowsappsdk.winui\2.0.12\buildTransitive\Microsoft.UI.Xaml.Markup.Compiler.interop.targets(764,9):
error MSB3073: The command ""...\tools\net6.0\..\net472\XamlCompiler.exe"
"obj\ARM64\Release\net10.0-windows10.0.22621.0\\input.json"
"obj\ARM64\Release\net10.0-windows10.0.22621.0\\output.json"" exited with code 1.

Repro

dotnet build tests\perf_bench\PerfBench.InteractivePool\InteractivePool.Bound\InteractivePool.Bound.csproj -c Release -p:Platform=ARM64

Fails reliably. Also reproduces via the full-solution build (dotnet build Reactor.slnx -c Release, which defaults to ARM64 on an ARM64 host).

Affected projects

A full-solution Release build surfaced four:

  • PerfBench.InteractivePool\InteractivePool.Bound
  • PerfBench.InteractivePool\InteractivePool.Direct
  • PerfBench.StructuralSharing\StructuralSharing.Bound
  • PerfBench.StructuralSharing\StructuralSharing.Direct

These four are just the ones that surfaced before the parallel build cascaded. Every PerfBench.*\*.Bound and *.Direct project ships an App.xaml (20 such projects), so the root cause very likely affects the whole XAML-bearing perf_bench family on ARM64, not only these four.

Pre-existing — not caused by any in-flight change

Confirmed by stashing all working-tree changes and rebuilding one project on the pristine tree: identical XamlCompiler.exe exited with code 1 (MSB3073). This is independent of the /perf work in #677.

Not affected

  • The /perf gate. It only builds StressPerf.ReactorOptimized and StressPerf.Direct, which have no XAML markup; both build cleanly self-contained on ARM64 (and CI is x64).
  • The rest of the solution (src/Reactor, samples, selftest/E2E hosts, StressPerf.*) compiled green in the same run.
  • CI on windows-latest (x64) — main is green there. This appears to be ARM64-host specific.

Suspected cause / investigation directions

  • XamlCompiler.exe resolves to the net472 build (...\tools\net6.0\..\net472\XamlCompiler.exe), a .NET Framework tool. Under ARM64 it runs via emulation; the failure is plausibly an emulation / arch-resolution issue in the markup compiler. Worth confirming whether a net6.0 variant exists and why the net472 path is selected.
  • Capture the compiler's real diagnostics: run XamlCompiler.exe input.json output.json directly against a failing project's obj\ARM64\... and inspect stdout/stderr + output.json.
  • Check whether forcing -p:Platform=x64 (or an x64 XamlCompiler) avoids it, to localize the issue to the ARM64 toolchain.
  • Check for a newer Microsoft.WindowsAppSDK that ships an ARM64-native or net6.0 markup compiler.

Environment

Filed as a follow-up from #677; out of scope for that PR (which is /perf CI-script only).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions