diff --git a/src/TeamsISO.App.WinUI.Probe/Program.cs b/src/TeamsISO.App.WinUI.Probe/Program.cs new file mode 100644 index 0000000..4e2d3a9 --- /dev/null +++ b/src/TeamsISO.App.WinUI.Probe/Program.cs @@ -0,0 +1,142 @@ +using System; +using System.Runtime.InteropServices; + +namespace TeamsISO.App.WinUI.Probe; + +/// +/// Tiny diagnostic console — calls the native MddBootstrapInitialize2 +/// export from Microsoft.WindowsAppRuntime.Bootstrap.dll directly and +/// reports the HResult. +/// +/// Use to isolate whether the WinUI 3 activation blocker is: +/// (a) Bootstrap DLL load — DllNotFoundException at the P/Invoke call +/// (b) Framework package resolution — Bootstrap returns non-S_OK HR +/// (c) Downstream — Bootstrap succeeds, the WinUI 3 .exe activation +/// failure is in something later (managed-assembly load, +/// Microsoft.WinUI.dll native imports, etc.) +/// +internal static class Program +{ + /// WindowsAppSDK target major/minor. + private const uint WindowsAppSdkMajorMinor = 0x00010006; + + [DllImport("Microsoft.WindowsAppRuntime.Bootstrap.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] + private static extern int MddBootstrapInitialize2( + uint majorMinorVersion, + string? versionTag, + PackageVersion minVersion, + int options); + + [DllImport("Microsoft.WindowsAppRuntime.Bootstrap.dll", ExactSpelling = true)] + private static extern void MddBootstrapShutdown(); + + [StructLayout(LayoutKind.Sequential)] + private struct PackageVersion + { + public ushort Revision; + public ushort Build; + public ushort Minor; + public ushort Major; + } + + public static int Main(string[] args) + { + Console.WriteLine("TeamsISO WinUI 3 bootstrap probe"); + Console.WriteLine("───────────────────────────────────────────"); + Console.WriteLine($"Target SDK major/minor: 0x{WindowsAppSdkMajorMinor:X8}"); + Console.WriteLine(); + + try + { + // Try with both null and "" for versionTag; report both. + var minVersion = new PackageVersion(); + Console.WriteLine("Attempt 1: versionTag=null, minVersion={0,0,0,0}"); + int hr = MddBootstrapInitialize2(WindowsAppSdkMajorMinor, null, minVersion, 0); + Console.WriteLine($" HR=0x{hr:X8} ({Describe(hr)})"); + + if (hr != 0) + { + Console.WriteLine(); + Console.WriteLine("Attempt 2: versionTag=\"\", minVersion={0,0,0,0}"); + hr = MddBootstrapInitialize2(WindowsAppSdkMajorMinor, "", minVersion, 0); + Console.WriteLine($" HR=0x{hr:X8} ({Describe(hr)})"); + } + + if (hr != 0) + { + Console.WriteLine(); + Console.WriteLine("Attempt 3: versionTag=\"\", options=1 (DoNotShowDialog)"); + hr = MddBootstrapInitialize2(WindowsAppSdkMajorMinor, "", minVersion, 1); + Console.WriteLine($" HR=0x{hr:X8} ({Describe(hr)})"); + } + + if (hr == 0) + { + Console.WriteLine(); + Console.WriteLine("Bootstrap succeeded."); + Console.WriteLine("The WinUI 3 .exe activation failure is NOT in the bootstrap."); + Console.WriteLine("Suspect: downstream managed-assembly load (Microsoft.WinUI.dll"); + Console.WriteLine("native imports during JIT)."); + MddBootstrapShutdown(); + } + else + { + Console.WriteLine(); + Console.WriteLine("Bootstrap failed. Decode the HResult:"); + DescribeHResult(hr); + } + } + catch (DllNotFoundException ex) + { + Console.WriteLine($"DllNotFoundException: {ex.Message}"); + Console.WriteLine(); + Console.WriteLine("Microsoft.WindowsAppRuntime.Bootstrap.dll couldn't be located by"); + Console.WriteLine("the loader. Check that the file is alongside the .exe and that the"); + Console.WriteLine("process architecture matches (x64 .exe loads x64 DLLs)."); + } + catch (Exception ex) + { + Console.WriteLine($"Unexpected: {ex.GetType().Name}: {ex.Message}"); + } + + Console.WriteLine(); + Console.WriteLine("Press any key to exit."); + Console.ReadKey(true); + return 0; + } + + private static string Describe(int hr) => hr switch + { + 0 => "S_OK", + unchecked((int)0x80073B17) => "ERROR_INSTALL_PACKAGE_NOT_FOUND", + unchecked((int)0x80073B19) => "ERROR_PACKAGES_REPUTATION_CHECK_FAILED", + unchecked((int)0x80004005) => "E_FAIL", + unchecked((int)0x80670016) => "MDD_E_BOOTSTRAP_INITIALIZE_DDLM_NOT_FOUND", + unchecked((int)0x80670017) => "MDD_E_BOOTSTRAP_INITIALIZE_LIFECYCLE_MANAGER_FAILURE", + _ => "(unknown HR)", + }; + + private static void DescribeHResult(int hr) + { + var description = (uint)hr switch + { + 0x80670016 => + "DDLM (Dynamic Dependency Lifetime Manager) for this WindowsAppSDK major.minor\n" + + " is NOT installed on this machine. The framework package (Microsoft.WindowsApp\n" + + " Runtime.1.6) may be present but its DDLM sibling — MicrosoftCorporationII.\n" + + " WinAppRuntime.Main.1.6 — is missing. Run \"Get-AppxPackage | Where Name -like\n" + + " '*WinAppRuntime.Main*'\" to see which versions have DDLM coverage. Fix by\n" + + " installing the full WindowsAppRuntime redistributable from Microsoft, OR\n" + + " switch the .csproj to a major.minor whose Main package IS installed.", + 0x80670017 => + "Lifecycle manager start failed. The DDLM is installed but couldn't be activated.\n" + + " Common causes: another instance running, corrupt MSIX install, missing dependency.", + 0x80073B17 => "Framework package not found. Install Microsoft.WindowsAppRuntime..", + 0x80073B18 => "Framework package version mismatch.", + 0x80073B19 => "Framework package not present for current user.", + 0x80073B26 => "Framework package architecture mismatch.", + _ => $"Unknown HResult. Look up in WindowsAppSDK source BootstrapErrorCodes.h.", + }; + Console.WriteLine($" {description}"); + } +} diff --git a/src/TeamsISO.App.WinUI.Probe/TeamsISO.App.WinUI.Probe.csproj b/src/TeamsISO.App.WinUI.Probe/TeamsISO.App.WinUI.Probe.csproj new file mode 100644 index 0000000..9111b90 --- /dev/null +++ b/src/TeamsISO.App.WinUI.Probe/TeamsISO.App.WinUI.Probe.csproj @@ -0,0 +1,49 @@ + + + + + + Exe + net8.0-windows + TeamsISO.App.WinUI.Probe + x64 + win-x64 + enable + enable + true + + + + + + + + diff --git a/src/TeamsISO.App.WinUI/Program.cs b/src/TeamsISO.App.WinUI/Program.cs index 03d4e1c..36087bd 100644 --- a/src/TeamsISO.App.WinUI/Program.cs +++ b/src/TeamsISO.App.WinUI/Program.cs @@ -27,8 +27,8 @@ namespace TeamsISO.App.WinUI; /// public static class Program { - /// WindowsAppSDK 1.6 major/minor packed as 0x00010006. - private const uint WindowsAppSdkMajorMinor = 0x00010006; + /// WindowsAppSDK 1.8 major/minor packed as 0x00010008. + private const uint WindowsAppSdkMajorMinor = 0x00010008; [STAThread] public static int Main(string[] args) diff --git a/src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj b/src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj index 3426f74..c618b05 100644 --- a/src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj +++ b/src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj @@ -83,14 +83,18 @@ - + diff --git a/src/TeamsISO.App.WinUI/Views/MainWindow.xaml b/src/TeamsISO.App.WinUI/Views/MainWindow.xaml index 40677ed..d05a4ef 100644 --- a/src/TeamsISO.App.WinUI/Views/MainWindow.xaml +++ b/src/TeamsISO.App.WinUI/Views/MainWindow.xaml @@ -326,102 +326,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + +