143 lines
6.2 KiB
C#
143 lines
6.2 KiB
C#
|
|
using System;
|
||
|
|
using System.Runtime.InteropServices;
|
||
|
|
|
||
|
|
namespace TeamsISO.App.WinUI.Probe;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 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.)
|
||
|
|
/// </summary>
|
||
|
|
internal static class Program
|
||
|
|
{
|
||
|
|
/// <summary>WindowsAppSDK target major/minor.</summary>
|
||
|
|
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.<x.y>.",
|
||
|
|
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}");
|
||
|
|
}
|
||
|
|
}
|