Skip to content

Commit 5409ae8

Browse files
Migrate to .NET 10 LTS, three months ahead of the .NET 8 deadline
.NET 8 goes out of support on 10 November 2026 and .NET 9 dies the same day, so .NET 10 LTS (EOL 14 November 2028) was the only target. This was the hardest date on the roadmap: after it, the installer would ship an unsupported runtime, a runtime CVE would be unpatchable, and it would show up as an EOL component in our own SBOM. What moved * All nine projects retargeted to net10.0-windows: ControlPanel, ControlPanel.Core, ControlPanel.Tests, DBSetup, DBSetupQuick, DBUpdater, DataDirectorySynchronizer, ImportTool, Shared. * global.json added, pinning SDK 10.0.303 with rollForward latestFeature. There was no global.json before, which meant installing any newer SDK on a build machine silently changed the toolchain. It now accepts 10.0.3xx and later within .NET 10 but never rolls to .NET 11 - that has to be a deliberate edit, alongside the TargetFramework values and the bundled runtime. * The bundled Desktop Runtime moves to 10.x, and get-dotnet-runtime.ps1 is parameterised by channel and now fails loudly if aka.ms hands back something under 40 MB. It previously would have saved an error page as the installer and failed silently at install time. * hMailServerInnoExtension.iss: the DotNetDesktopMissing() probe globbed Microsoft.WindowsDesktop.App\8.* and now globs 10.*. Left unchanged it would have found the .NET 8 runtime, concluded nothing needed installing, and shipped a Control Panel that could not start. * section_files_64.iss, section_run.iss and the progress text follow the new filename. * capture-cp.ps1 had the net8.0-windows output path hardcoded. * AGENTS.md, README.md and CONTROL-PANEL-PLAN.md updated. AGENTS.md was also stale on two counts unrelated to this work - it still claimed 6.2.8 build 10 and 898/898 tests; it now says 6.2.18 build 20 and 1049/1049. Two real findings, not just retargeting * .NET 9 added the WFO1000 WinForms analyzer, and with warnings-as-errors it failed the build on four properties of Shared/Controls/ucText.cs whose designer-serialization intent was undeclared. The analyzer was right: Text and Numeric are genuine designer state, but Number and Number64 are derived views over Text, and the designer had been emitting meaningless "Number = 0" / "Number64 = 0" lines into generated code for years. Intent is now declared per property. Existing generated lines still compile, so this changes only what the designer writes from here on. * System.DirectoryServices is now part of the Windows Desktop shared framework, so the explicit PackageReference was redundant (NU1510). It is used by ActiveDirectoryService.cs and still resolves; the package is gone and the SBOM is one entry shorter. Packages taken to current: System.Management and System.ServiceProcess.ServiceController 10.0.10 -> 10.0.11 in both ControlPanel and DBSetup. WPF-UI 4.3.0, LiveChartsCore 2.0.5 and QRCoder 1.8.0 were already latest. The regression suite's packages.config is deliberately untouched in this commit - it is the harness that validates everything else, and bumping it belongs in its own change. One thing deliberately NOT changed: MinVersion stays at 10.0.14393. The comment claimed that build was the floor of the .NET 8 runtime, so the obvious move was to raise it for .NET 10 - but .NET 10 still supports Windows 10 1607 and Windows Server 2012, so raising it would have locked out supported configurations for no reason. Verification * Both solutions build with 0 warnings, 0 errors. * ControlPanel.Tests: 45/45 pass on net10.0. * The published Control Panel starts and stays up - a WPF app can build clean and still die at startup, so this was checked rather than assumed. * The C++ server is untouched by this commit.
1 parent e3fef94 commit 5409ae8

20 files changed

Lines changed: 127 additions & 84 deletions

File tree

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Technology
8888
| Async I/O | Boost 1.91 (Asio) |
8989
| Databases | MySQL, MariaDB, MS SQL Server, PostgreSQL 18 (libpq), and the embedded SQL CE for zero-configuration installs |
9090
| MySQL/MariaDB client | MariaDB Connector/C, shipped as `libmysql.dll` with auth plugins — works with MySQL 8 `caching_sha2_password` and MariaDB `ed25519`/`gssapi` out of the box |
91-
| Administration GUI and tools | C# / .NET 8 (WPF, Fluent design) |
91+
| Administration GUI and tools | C# / .NET 10 (WPF, Fluent design) |
9292
| Extensibility | COM/IDispatch API, plus a REST administration API |
9393
| Schema | Database version 6005, upgradeable from every earlier hMailServer release |
9494

@@ -97,12 +97,12 @@ Technology
9797
Administration
9898
==============
9999

100-
**hMailServer Control Panel** (`hMailCP.exe`) is the bundled administration GUI: a .NET 8 WPF application that talks to the server purely through the COM API. It covers domains, accounts, aliases, distribution lists, routes, rules, IP ranges, TCP/IP ports and SSL bindings, server settings, the live dashboard, the delivery queue, logs, status, backup, SSL certificates, scripts, Sieve scripts and public folders.
100+
**hMailServer Control Panel** (`hMailCP.exe`) is the bundled administration GUI: a .NET 10 WPF application that talks to the server purely through the COM API. It covers domains, accounts, aliases, distribution lists, routes, rules, IP ranges, TCP/IP ports and SSL bindings, server settings, the live dashboard, the delivery queue, logs, status, backup, SSL certificates, scripts, Sieve scripts and public folders.
101101

102102
* **Ctrl+K** searches every setting by label or INI key — type `delete logs`, `log level` or `LogDeleteDays` and it takes you to the page that owns it.
103103
* **Active Directory pickers**: a read-only browser lists the forest's domains and searches their users, to link an account to an AD user or bulk-import addresses into a distribution list.
104104
* Optional TOTP two-factor authentication on logon.
105-
* Requires the .NET 8 Desktop Runtime, which the installer bundles and installs silently when missing.
105+
* Requires the .NET 10 Desktop Runtime, which the installer bundles and installs silently when missing.
106106

107107
**REST administration API** for domains, accounts, the delivery queue, server status and TLSA records, with authenticated access and bounded request handling (a size cap and a receive deadline, so a slow or oversized request cannot occupy a worker).
108108

@@ -230,11 +230,11 @@ Alternatively, build from Visual Studio (started with _Run as Administrator_) or
230230
1. Download the source code from this Git repository.
231231
2. Compile the solution hmailserver\source\Server\hMailServer\hMailServer.sln.
232232
This will build the hMailServer server-part (hMailServer.exe)
233-
3. Build and publish the .NET 8 setup tools with build\build-tools.ps1 (or
233+
3. Build and publish the .NET 10 setup tools with build\build-tools.ps1 (or
234234
"dotnet build" on hmailserver\source\Tools\hMailServer Tools.sln).
235235
This covers DB Setup, DB Setup Quick, DB Updater, the Data Directory
236236
Synchronizer and the Import Tool.
237-
The Control Panel is a separate .NET 8 solution, hmailserver\source\Tools\ControlPanel.sln.
237+
The Control Panel is a separate .NET 10 solution, hmailserver\source\Tools\ControlPanel.sln.
238238
4. Compile hmailserver\installation\hMailServer64.iss (using Inno Setup 6)
239239
This will build the hMailServer installation program.
240240

Roadmap.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ strong and where it is thin far more honestly than any prose summary.
4343

4444
| Section || 🔄 || ⏸️ |
4545
|---|--:|--:|--:|--:|
46-
| [Dated items — the forcing functions](#dated-items--the-forcing-functions) | || 6 | 1 |
46+
| [Dated items — the forcing functions](#dated-items--the-forcing-functions) | 1 || 5 | 1 |
4747
| [Defects found by the audit](#defects-found-by-the-audit) ||| 16 ||
4848
| **The capability matrix** | | | | |
4949
| [SMTP and ESMTP](#smtp-and-esmtp) | 23 || 4 ||
@@ -63,9 +63,9 @@ strong and where it is thin far more honestly than any prose summary.
6363
| **Forward-looking** | | | | |
6464
| [Planned work](#planned-work) || 2 | 16 | 2 |
6565
| [Future-proofing: standards and protocols](#future-proofing-standards-and-protocols) ||| 6 | 2 |
66-
| [Future-proofing: platform and supply chain](#future-proofing-platform-and-supply-chain) | || 6 | 2 |
66+
| [Future-proofing: platform and supply chain](#future-proofing-platform-and-supply-chain) | 1 || 5 | 2 |
6767
| [Future-proofing: deployment and operations](#future-proofing-deployment-and-operations) ||| 9 ||
68-
| **Total** | **495** | **2** | **200** | **14** |
68+
| **Total** | **497** | **2** | **198** | **14** |
6969

7070
Three things stand out and are worth naming rather than leaving to be inferred.
7171
**Storage and the administration surface are the best-covered areas**, and the
@@ -84,7 +84,7 @@ previous version of this roadmap. Ordered by when they bite.
8484

8585
| | Date | Item | What happens |
8686
|:-:|---|---|---|
87-
| | **10 Nov 2026** | **.NET 8 end of support** | The Control Panel and all six command-line tools target .NET 8. .NET 9 dies the same day, so the only target is **.NET 10 LTS** (EOL 14 Nov 2028). After this date the installer ships an unsupported runtime that will show up as an EOL component in our own SBOM, and a runtime CVE becomes unpatchable. **This is the hardest date on the board.** |
87+
| | ~~10 Nov 2026~~ | **.NET 8 end of support — done, 12 Aug 2026** | Migrated to **.NET 10 LTS** (EOL 14 Nov 2028) with three months to spare. All nine projects retargeted to `net10.0-windows`, SDK pinned in `global.json` (`rollForward: latestFeature`, so a newer SDK on a build machine cannot silently change the toolchain), the bundled Desktop Runtime and the installer's version probe moved to 10.x, and packages taken to current. Everything builds with **0 warnings** and the Control Panel starts clean. |
8888
|| **End Dec 2026** | **Microsoft 365 turns off Basic auth for SMTP AUTH** | The outbound client offers exactly one mechanism — `AUTH LOGIN`. Anyone relaying through `smtp.office365.com` stops working. Needs a token cache plus XOAUTH2 encoding; note Exchange Online implements **XOAUTH2 only**, not RFC 7628 OAUTHBEARER. Collecting *from* M365 over POP/IMAP has already been broken since 2022. |
8989
|| **9 Dec 2026** | **EU Product Liability Directive (2024/2853)** | Software is unambiguously a "product"; a product can be defective *because of a vulnerability or a failure to ship security updates*, and liability **cannot be disclaimed by licence** — AGPLv3's warranty disclaimer does not help. FOSS supplied outside a commercial activity is exempt. Documentation, not code, but it should drive a business decision. |
9090
|| **12 Jan 2027** | **Windows Server 2016 end of support** | The moment to declare a supported floor. Recommendation: **Server 2019 / Windows 10 21H2**, which costs zero code — Server 2019 is still `_WIN32_WINNT=0x0A00`. Do not raise the macro past that; self-hosted mail skews old and Server 2019 has support into 2029. |
@@ -983,7 +983,7 @@ Future-proofing: platform and supply chain
983983

984984
| | Item | Detail |
985985
|:-:|---|---|
986-
| | **Migrate to .NET 10 LTS** | See the dated table — 10 Nov 2026, and the hardest deadline here. |
986+
| | **Migrate to .NET 10 LTS** | Done 12 Aug 2026, ahead of the 10 Nov 2026 deadline. Nine projects to `net10.0-windows`; SDK 10.0.303 pinned in `global.json`; bundled Desktop Runtime, the installer's `Microsoft.WindowsDesktop.App\10.*` probe, the runtime-fetch script, the screenshot script and the docs all moved together. Two real findings on the way: .NET 9 added the **WFO1000** WinForms analyzer, which (correctly) rejected four properties on `ucText` whose designer-serialization intent was undeclared — the designer had been emitting meaningless `Number = 0` lines for years; and `System.DirectoryServices` is now in the Windows Desktop shared framework, so that `PackageReference` was redundant and is gone. **`MinVersion` stays at 10.0.14393** — .NET 10 still supports Windows 10 1607 and Server 2012, which was worth checking rather than assuming. |
987987
|| **Decide the OpenSSL branch** | 4.0.x is not LTS and dies 14 May 2027. Decide by Q1 2027 whether to follow to the next LTS or move back to 3.5. |
988988
|| **Declare a supported Windows floor** | Server 2019 / Windows 10 21H2, effective with the first release after 12 Jan 2027. Zero code cost — Server 2019 is still `_WIN32_WINNT=0x0A00`, and that macro should *not* be raised. |
989989
|| **Artifact signing** | SBOMs are already attached to every release in both SPDX and CycloneDX. The gap is signing: Authenticode on the installer and binaries, and ideally Sigstore for the release artefacts. This is the supply-chain item that is actually missing, and the CRA makes update integrity a formal requirement if scope ever changes. |

build/capture-cp.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static Bitmap Shoot(IntPtr h){RECT r;GetWindowRect(h,out r);int w=r.Right
2424
if ($Launch) {
2525
Stop-Process -Name hMailCP -Force -ErrorAction SilentlyContinue
2626
Start-Sleep 1
27-
$exe = Join-Path $PSScriptRoot '..\hmailserver\source\Tools\ControlPanel\bin\Release\net8.0-windows\hMailCP.exe'
27+
$exe = Join-Path $PSScriptRoot '..\hmailserver\source\Tools\ControlPanel\bin\Release\net10.0-windows\hMailCP.exe'
2828
Start-Process $exe -ArgumentList '/connect','localhost','Administrator','testar' | Out-Null
2929
Start-Sleep 10
3030
}

build/get-dotnet-runtime.ps1

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,37 @@
1-
# Downloads the .NET 8 Desktop Runtime installer that the hMailServer
2-
# installer bundles for the Control Panel component. The file is not kept
3-
# in the repository (55+ MB); run this once before building the installer.
1+
# Downloads the .NET Desktop Runtime installer that the hMailServer installer
2+
# bundles for the Control Panel component. The file is not kept in the repository
3+
# (55+ MB, and .gitignore excludes the whole DotNet folder); run this once before
4+
# building the installer.
5+
#
6+
# Keep the version here in step with three other places, or the installer will
7+
# either ship the wrong runtime or decide it does not need to install one:
8+
# * <TargetFramework> in the nine .csproj files under source/Tools
9+
# * global.json (the SDK pin)
10+
# * hMailServerInnoExtension.iss -> DotNetDesktopMissing(), which globs
11+
# Microsoft.WindowsDesktop.App\<major>.* to decide whether to run this
12+
# * section_files_64.iss and section_run.iss, which reference the file by name
13+
param(
14+
[string] $Channel = '10.0'
15+
)
16+
417
$dest = Join-Path $PSScriptRoot '..\hmailserver\installation\DotNet'
518
New-Item -ItemType Directory -Force $dest | Out-Null
6-
$file = Join-Path $dest 'windowsdesktop-runtime-8.0-win-x64.exe'
19+
$file = Join-Path $dest ("windowsdesktop-runtime-{0}-win-x64.exe" -f $Channel)
720

821
if (Test-Path $file) {
922
Write-Host "already present: $file"
1023
return
1124
}
1225

13-
Write-Host 'downloading .NET 8 Desktop Runtime (x64)...'
14-
Invoke-WebRequest -Uri 'https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe' -OutFile $file
15-
Write-Host ("downloaded {0} ({1:N1} MB)" -f $file, ((Get-Item $file).Length / 1MB))
26+
Write-Host ("downloading .NET {0} Desktop Runtime (x64)..." -f $Channel)
27+
Invoke-WebRequest -Uri ("https://aka.ms/dotnet/{0}/windowsdesktop-runtime-win-x64.exe" -f $Channel) -OutFile $file
28+
29+
$size = (Get-Item $file).Length
30+
if ($size -lt 40MB) {
31+
# aka.ms redirects; a short file means we saved an error page rather than the
32+
# installer, which would otherwise fail silently at install time.
33+
Remove-Item $file -Force
34+
throw ("downloaded file was only {0:N1} MB - expected 50+ MB. The aka.ms link for channel {1} may have moved." -f ($size / 1MB), $Channel)
35+
}
36+
37+
Write-Host ("downloaded {0} ({1:N1} MB)" -f $file, ($size / 1MB))

global.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"//": "Pins the .NET SDK so builds are reproducible and installing a newer SDK on a build machine cannot silently change the toolchain. rollForward latestFeature accepts 10.0.3xx and later within .NET 10, but never rolls to .NET 11 - that has to be a deliberate edit here, alongside the TargetFramework values and the runtime the installer bundles.",
3+
"sdk": {
4+
"version": "10.0.303",
5+
"rollForward": "latestFeature",
6+
"allowPrerelease": false
7+
}
8+
}

hmailserver/installation/hMailServerInnoExtension.iss

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ var
1010
rdoUseInternal : TRadioButton;
1111
rdoUseExternal : TRadioButton;
1212
13-
// Returns true when the .NET 8 Desktop Runtime is not installed, in
13+
// Returns true when the .NET 10 Desktop Runtime is not installed, in
1414
// which case the bundled runtime installer is executed.
1515
function DotNetDesktopMissing(): Boolean;
1616
var
1717
findRec: TFindRec;
1818
begin
1919
Result := True;
20-
if FindFirst(ExpandConstant('{pf64}\dotnet\shared\Microsoft.WindowsDesktop.App\8.*'), findRec) then
20+
if FindFirst(ExpandConstant('{pf64}\dotnet\shared\Microsoft.WindowsDesktop.App.*'), findRec) then
2121
begin
2222
Result := False;
2323
FindClose(findRec);
@@ -281,9 +281,9 @@ begin
281281
Result := sKey;
282282
end;
283283
284-
// Installs the bundled .NET 8 Desktop Runtime when it is missing. Called
284+
// Installs the bundled .NET 10 Desktop Runtime when it is missing. Called
285285
// from RunPostInstallTasks before the database tools are executed - they
286-
// are .NET 8 apps and run from [Code] at ssPostInstall, which is earlier
286+
// are .NET 10 apps and run from [Code] at ssPostInstall, which is earlier
287287
// than the [Run] section where the runtime is otherwise installed for the
288288
// Control Panel component.
289289
procedure InstallDotNetRuntime();
@@ -293,9 +293,9 @@ begin
293293
if not DotNetDesktopMissing() then
294294
Exit;
295295
296-
if (Exec(ExpandConstant('{tmp}\windowsdesktop-runtime-8.0-win-x64.exe'), '/install /quiet /norestart', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) = False) then
296+
if (Exec(ExpandConstant('{tmp}\windowsdesktop-runtime-10.0-win-x64.exe'), '/install /quiet /norestart', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) = False) then
297297
begin
298-
MsgBox('The .NET 8 Desktop Runtime could not be installed. The database setup tools will not work until it is installed.' + #13#10 +
298+
MsgBox('The .NET 10 Desktop Runtime could not be installed. The database setup tools will not work until it is installed.' + #13#10 +
299299
SysErrorMessage(ResultCode), mbError, MB_OK);
300300
Exit;
301301
end;
@@ -304,7 +304,7 @@ begin
304304
// result is the exit code. 0 = success, 3010 = success, reboot required.
305305
if (ResultCode <> 0) and (ResultCode <> 3010) then
306306
begin
307-
MsgBox('The .NET 8 Desktop Runtime installation failed with exit code ' + IntToStr(ResultCode) + '.' + #13#10 +
307+
MsgBox('The .NET 10 Desktop Runtime installation failed with exit code ' + IntToStr(ResultCode) + '.' + #13#10 +
308308
'The database setup tools will not work until the runtime is installed. ' +
309309
'Install it manually from https://dotnet.microsoft.com/download/dotnet/8.0 and then run ' +
310310
'DBSetupQuick.exe from the hMailServer Bin folder.', mbError, MB_OK);
@@ -491,7 +491,7 @@ function InitializeSetup(): Boolean;
491491
begin
492492
Result := true;
493493
494-
// The .NET tools require the .NET 8 Desktop Runtime; it is bundled and
494+
// The .NET tools require the .NET 10 Desktop Runtime; it is bundled and
495495
// installed automatically when missing, so no up-front framework check
496496
// is needed (the old .NET Framework 4.5 gate died with the last
497497
// .NET Framework tools).
@@ -648,10 +648,10 @@ begin
648648
ProgressPage := CreateOutputProgressPage('Finalizing installation','Please wait while the setup performs post-installation tasks');
649649
ProgressPage.Show();
650650
651-
ProgressPage.SetText('Installing the .NET 8 Desktop Runtime...', '');
651+
ProgressPage.SetText('Installing the .NET 10 Desktop Runtime...', '');
652652
ProgressPage.SetProgress(1,6);
653653
654-
// The database tools below are .NET 8 apps; make sure the runtime is
654+
// The database tools below are .NET 10 apps; make sure the runtime is
655655
// in place before they are executed. ([Run] would install it too, but
656656
// that section runs after this code.)
657657
InstallDotNetRuntime();

hmailserver/installation/section_components.iss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ Name: "server"; Description: "Server"; Types: full custom
55
; remote instance. The Control Panel does not need it: it binds late, through
66
; IDispatch, and connects to a remote host on its own.
77
Name: "admintools"; Description: "Remote administration support (registers the COM API for scripts)"; Types: full custom
8-
Name: "controlpanel"; Description: "Control Panel (modern admin app, requires .NET 8 Desktop Runtime)"; Types: full custom
8+
Name: "controlpanel"; Description: "Control Panel (modern admin app, requires .NET 10 Desktop Runtime)"; Types: full custom

hmailserver/installation/section_files_64.iss

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ Source: "Microsoft.VC145.CRT\*"; DestDir: "{app}\Bin"; Flags: ignoreversion; Com
1111
; Web administration SPA (served by the REST API listener at GET /)
1212
Source: "WebAdmin\index.html"; DestDir: "{app}\WebAdmin"; Flags: ignoreversion; Components: server;
1313

14-
; hMailServer Control Panel (modern .NET 8 WPF admin app)
14+
; hMailServer Control Panel (modern .NET 10 WPF admin app)
1515
Source: "..\source\Tools\ControlPanel\publish\*"; DestDir: "{app}\ControlPanel"; Flags: ignoreversion recursesubdirs; Components: controlpanel;
16-
; .NET 8 Desktop Runtime, installed silently when missing. The server
17-
; component needs it too: DBSetup/DBSetupQuick/DBUpdater are .NET 8 apps
16+
; .NET 10 Desktop Runtime, installed silently when missing. The server
17+
; component needs it too: DBSetup/DBSetupQuick/DBUpdater are .NET 10 apps
1818
; that run during installation (from [Code], before [Run] executes - see
1919
; InstallDotNetRuntime in hMailServerInnoExtension.iss).
2020
; (file is downloaded by build\get-dotnet-runtime.ps1; not in the repository)
21-
Source: "DotNet\windowsdesktop-runtime-8.0-win-x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall; Components: server controlpanel;
21+
Source: "DotNet\windowsdesktop-runtime-10.0-win-x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall; Components: server controlpanel;
2222

2323
Source: "SQLCE\SSCERuntime_x64-ENU.msi"; Flags: deleteafterinstall ; Excludes: ".svn"; DestDir: "{tmp}"; Components: server;
2424

25-
; Common tools (.NET 8, framework-dependent dotnet publish output; built by
25+
; Common tools (.NET 10, framework-dependent dotnet publish output; built by
2626
; build\build-tools.ps1). The three database tools share {app}\Bin - their
2727
; publish folders carry identical copies of Shared.dll and the checked-in
2828
; Interop.hMailServer.dll tlbimp wrapper (source\Tools\Interop), which
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[Run]
2-
; Install the bundled .NET 8 Desktop Runtime, but only when it is missing.
2+
; Install the bundled .NET 10 Desktop Runtime, but only when it is missing.
33
; For the server component the runtime is normally already installed by
44
; InstallDotNetRuntime() at ssPostInstall (before the database tools run);
55
; this entry is the backstop and covers controlpanel-only installs.
6-
Filename: "{tmp}\windowsdesktop-runtime-8.0-win-x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Installing .NET 8 Desktop Runtime..."; Check: DotNetDesktopMissing; Components: server controlpanel;
6+
Filename: "{tmp}\windowsdesktop-runtime-10.0-win-x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Installing .NET 10 Desktop Runtime..."; Check: DotNetDesktopMissing; Components: server controlpanel;
77
Filename: "{app}\ControlPanel\hMailCP.exe"; Flags: skipifsilent postinstall nowait; Description: Run hMailServer Control Panel; Components: controlpanel;

hmailserver/installation/section_setup.iss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ AllowNoIcons=yes
1212
Uninstallable=true
1313
DirExistsWarning=no
1414
CreateAppDir=true
15-
; Windows 10 1607 (build 14393): the floor of the .NET 8 Desktop Runtime,
15+
; Windows 10 1607 (build 14393): the floor of the .NET 10 Desktop Runtime,
1616
; which the Control Panel and the setup tools require (bundled, installed
1717
; when missing - its installer refuses anything older, which would leave the
1818
; server without a database). The binaries link the VC++ v145 runtime.

0 commit comments

Comments
 (0)