Upgrade to .NET 10 - #1
Merged
Merged
Conversation
Moves from .NET Framework 4.8.1 to net10.0-windows, keeping Windows Forms.
The database engine is deliberately untouched so that any breakage is
unambiguously the framework change.
The csproj becomes SDK-style, so files no longer have to be hand-listed. The
six dlls committed under ImageStore/ are gone: upstream Shipwreck.Phash 0.5.0
turns out to expose the same GetCrossCorrelation overloads the fork was kept
for, and the other four are part of the BCL on .NET 10.
Assembly metadata moves into the csproj. That is not cosmetic — with
GenerateAssemblyInfo disabled the SDK also omits SupportedOSPlatform("windows")
for a -windows TFM, and every WinForms call then reports CA1416.
System.Management.Automation is referenced with ExcludeAssets="runtime;native".
Excluding only runtime still ships the host's native payload, including
libpsl-native for Linux and macOS in a Windows-only module.
Consequence: Windows PowerShell 5.1 can no longer load the module, since it
runs on .NET Framework. v2026.08.15.2 remains the last release for 5.1 users.
Also adds a pull_request trigger that builds without publishing, so a change
this size can be verified before it reaches master.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
README gains a requirements section and switches to pwsh. The minimum is PowerShell 7.6, not just "7 or later": 7.6 is the first release built on .NET 10, and an older pwsh cannot load a net10.0 assembly. Also documents that the two window-opening cmdlets need STA, which pwsh provides by default but VS Code's Integrated Console does not, and that the archive has to be unpacked as a whole because the module now ships with its dependency tree. Drops the fork attribution for phash. CLAUDE.md is rewritten where it went stale: the rule about hand-adding files to the csproj is gone with the legacy project format, and the claim that this cannot be built on Linux was wrong enough to matter -- EnableWindowsTargeting builds and publishes fine there, which is how the native-payload leak was caught. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Moves from .NET Framework 4.8.1 to
net10.0-windows, keeping Windows Forms. The database engine is deliberately left on SQL Server so that any breakage here is unambiguously the framework change.What changed
Shipwreck.Phash0.5.0 exposes the same fourGetCrossCorrelationoverloads the fork was kept for — verified by reflecting over both assemblies — and the other four are part of the BCL on .NET 10.System.Data.SqlClient→Microsoft.Data.SqlClientacross 59 files. Only theusingline moves; everySqlDbTypeuse was already written asSystem.Data.SqlDbType.*, and that enum is unchanged.Assembly.CodeBase→AppContext.BaseDirectory(obsolete on .NET 5+).SHA1Managed→SHA1.Create()(SYSLIB0021). Same algorithm, same output.GenerateAssemblyInfodisabled the SDK also omitsSupportedOSPlatform("windows")for a-windowsTFM, which made every WinForms call report CA1416 — 1542 warnings.DefaultValueon three UserControl properties (WFO1000).Breaking change
Windows PowerShell 5.1 can no longer load this module — it runs on .NET Framework.
v2026.08.15.2remains the last release that loads under 5.1.The minimum is PowerShell 7.6, not merely "7.x": 7.6 is the first release built on .NET 10, and an older
pwshcannot load anet10.0assembly.System.Management.Automation7.6.5 targetsnet10.0, confirming the floor.pwshdefaults to STA on Windows, so the WinForms cmdlets keep working without threading changes. VS Code's PowerShell Integrated Console runs MTA and is the exception.Packaging
ExcludeAssets="runtime;native"onSystem.Management.Automation. Excluding onlyruntimestill shipped the host's native payload —pwrshplugin.dll,PowerShell.Core.Instrumentation.dll, andlibpsl-native.so/.dylibfor Linux and macOS in a Windows-only module. Removing it dropped the package from 78 files to 42.The workflow now packages the whole publish tree rather than flat
*.dll, becauseImageStore.deps.jsondrives dependency resolution and SqlClient's native SNI library lives underruntimes/<rid>/native. Flattening produces a module that loads and then fails on first connect.The package grows to ~11 MB;
Microsoft.Data.SqlClientpulls in Azure.Identity and friends. It shrinks again when SQLite replaces it.Verification
EnableWindowsTargeting— 0 warnings, 0 errors. Worth noting the repo could be built on Linux all along; that is how the native-payload leak was found.Publish releasecorrectly skipped for the PR..pdb.Not verified, and CI cannot cover it:
Import-Moduleunder a realpwsh, a database round-trip, and the two interactive WinForms cmdlets. Those need a Windows box with SQL Server before this is tagged as a release.🤖 Generated with Claude Code