From 3d9d59f9a9775de684060dd048ac09045e0bfcc3 Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Thu, 2 Oct 2025 21:24:01 -0700 Subject: [PATCH] Automatically detecting runtime when not specified. --- .../Commands/WindowsPackCommandRunner.cs | 1 + .../Msi/MsiBuilder.cs | 24 ++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs index a96598f6..59891707 100644 --- a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs @@ -339,6 +339,7 @@ public class WindowsPackCommandRunner : PackageBuilder private void CompileWixTemplateToMsi(Action progress, DirectoryInfo portableDirectory, string msiFilePath) { var templateData = MsiBuilder.ConvertOptionsToTemplateData( + MainExePath, portableDirectory, GetShortcuts(), GetRuntimeDependencies(), diff --git a/src/vpk/Velopack.Packaging.Windows/Msi/MsiBuilder.cs b/src/vpk/Velopack.Packaging.Windows/Msi/MsiBuilder.cs index d1b297fe..b8403b79 100644 --- a/src/vpk/Velopack.Packaging.Windows/Msi/MsiBuilder.cs +++ b/src/vpk/Velopack.Packaging.Windows/Msi/MsiBuilder.cs @@ -4,6 +4,7 @@ using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using System.Xml; +using AsmResolver.PE; using HandlebarsDotNet; using Markdig; using Microsoft.Extensions.Logging; @@ -105,7 +106,7 @@ public static class MsiBuilder return rv; } - public static MsiTemplateData ConvertOptionsToTemplateData(DirectoryInfo portableDir, ShortcutLocation shortcuts, + public static MsiTemplateData ConvertOptionsToTemplateData(string mainExePath, DirectoryInfo portableDir, ShortcutLocation shortcuts, string runtimeDeps, WindowsPackOptions options) { // WiX Identifiers may contain ASCII characters A-Z, a-z, digits, underscores (_), or @@ -120,6 +121,12 @@ public static class MsiBuilder msiVersion = $"{parsedVersion.Major}.{parsedVersion.Minor}.{parsedVersion.Patch}.0"; } + RuntimeCpu runtimeCpu = options.TargetRuntime.Architecture; + if (runtimeCpu == RuntimeCpu.Unknown) { + runtimeCpu = GetMachineForBinary(mainExePath); + options.TargetRuntime.Architecture = runtimeCpu; + } + return new MsiTemplateData() { WixId = wixId, AppId = options.PackId, @@ -128,8 +135,8 @@ public static class MsiBuilder AppMsiVersion = msiVersion, AppVersion = parsedVersion.ToFullString(), SourceDirectoryPath = portableDir.FullName, - Is64Bit = options.TargetRuntime.Architecture is not RuntimeCpu.x86 and not RuntimeCpu.Unknown, - IsArm64 = options.TargetRuntime.Architecture is RuntimeCpu.arm64, + Is64Bit = runtimeCpu is RuntimeCpu.x64, + IsArm64 = runtimeCpu is RuntimeCpu.arm64, InstallForAllUsers = options.InstLocation.HasFlag(InstallLocation.PerMachine), InstallForCurrentUser = options.InstLocation.HasFlag(InstallLocation.PerUser), UpgradeCodeGuid = GuidUtil.CreateGuidFromHash($"{options.PackId}:UpgradeCode").ToString(), @@ -148,6 +155,17 @@ public static class MsiBuilder WelcomeMessage = GetPlainTextMessage(options.InstWelcome), LicenseRtfFilePath = GetLicenseRtfPath(options.InstLicense, portableDir.Parent), }; + + static RuntimeCpu GetMachineForBinary(string path) + { + var image = PEImage.FromFile(path); + + if (image.MachineType.HasFlag(AsmResolver.PE.File.Headers.MachineType.Amd64)) + return RuntimeCpu.x64; + if (image.MachineType.HasFlag(AsmResolver.PE.File.Headers.MachineType.Arm64)) + return RuntimeCpu.arm64; + return RuntimeCpu.x86; + } } [SupportedOSPlatform("windows")]