Skip to content

.NET 10 - Blocked by Linux Support#748

Open
dreamsyntax wants to merge 1 commit intoReloaded-Project:masterfrom
dreamsyntax:NET10-TIME
Open

.NET 10 - Blocked by Linux Support#748
dreamsyntax wants to merge 1 commit intoReloaded-Project:masterfrom
dreamsyntax:NET10-TIME

Conversation

@dreamsyntax
Copy link
Contributor

@dreamsyntax dreamsyntax commented Nov 14, 2025

  • Minimal upgrade to test out .NET 10
    * Upgrade CI to latest actions, bump node 14 to node 20 to match other R-II mod repo | Moved to other PR
  • Does not update the Template

--

Windows tested ✔️
Linux - ❌ - unable to add new games - breaks on attempting to invoke the FileDialog
image

Summary by CodeRabbit

  • Chores
    • Updated all components to target .NET 10.0, upgrading from .NET 9.0.
    • Updated build infrastructure and GitHub Actions workflows to support the new framework version.
    • Updated build tools and dependencies to compatible versions.

@dreamsyntax dreamsyntax marked this pull request as draft November 14, 2025 21:56
@dreamsyntax
Copy link
Contributor Author

image Build from artifacts seems to function as expected, but CI also reports an error which has me stumped. NET 9 isn't defined in R-II CLI csproj anywhere..

build
Assets file 'D:\a\Reloaded-II\Reloaded-II\source\Reloaded.Mod.Installer.Cli\obj\project.assets.json' doesn't have a target for 'net9.0-windows'. Ensure that restore has run and that you have included 'net9.0-windows' in the TargetFrameworks for your project.

@Sewer56
Copy link
Member

Sewer56 commented Nov 14, 2025

Just search 9.0 in all files. Maybe there's an override somewhere, like in build script.

@dreamsyntax
Copy link
Contributor Author

Just search 9.0 in all files. Maybe there's an override somewhere, like in build script.

"Hmph too easy"

Oops, didn't check the ps1 scripts.

@dreamsyntax dreamsyntax marked this pull request as ready for review November 14, 2025 22:23
@dreamsyntax dreamsyntax marked this pull request as draft November 15, 2025 01:05
@dreamsyntax dreamsyntax changed the title .NET 10 .NET 10 - Blocked by Linux Support Nov 15, 2025
@dreamsyntax
Copy link
Contributor Author

Holding off on this until .NET 10 is better supported in wine.

@dreamsyntax
Copy link
Contributor Author

Linux exclusive error thrown on clicking the + button / "Add an application"

Exception:
Unable to cast object of type 'Ookii.Dialogs.Wpf.Interop.FileSaveDialogRCW' to type 'Ookii.Dialogs.Wpf.Interop.NativeFileSaveDialog'.
Stacktrace:
   at Ookii.Dialogs.Wpf.VistaSaveFileDialog.CreateFileDialog()
   at Ookii.Dialogs.Wpf.VistaFileDialog.RunFileDialog(IntPtr hwndOwner)
   at Ookii.Dialogs.Wpf.VistaFileDialog.ShowDialog(IntPtr owner)
   at Ookii.Dialogs.Wpf.VistaFileDialog.ShowDialog(Window owner)
   at Ookii.Dialogs.Wpf.VistaFileDialog.ShowDialog()
   at Reloaded.Mod.Launcher.Lib.Commands.Application.AddApplicationCommand.SelectEXEFile()
   at Reloaded.Mod.Launcher.Lib.Commands.Application.AddApplicationCommand.ExecuteAsync(Object parameter)
   at Reloaded.Mod.Launcher.Lib.Commands.Application.AddApplicationCommand.Execute(Object parameter)
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__124_0(Object state)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.Show()
   at System.Windows.Window.ShowDialog()
   at Reloaded.Mod.Launcher.App.OnStartup(Object sender, StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1_0(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at Reloaded.Mod.Launcher.App.Main()

@dreamsyntax
Copy link
Contributor Author

Going to look into this cast, since Ookii dialogs library is deprecated and unlikely to fix this themselves.

Copy link
Member

@Sewer56 Sewer56 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You cannot use the Open dialog instead of Save. At least not for adding games. You'll break Xbox Store games on Windows.

[This is why the Save dialog is used here, actually]

You don't have filesystem access to the files (not even Explorer does), and open dialog will error on selection while selecting an encrypted Xbox Store exe.

While Reloaded is capable of stripping it, if you can't select the game in the first place via the dialog, we're no ball.

I'd rather wait until it's fixed upstream in Wine/Proton instead. This subtly different behaviour could pop up elsewhere.

@dreamsyntax
Copy link
Contributor Author

dreamsyntax commented Nov 23, 2025

Option two is removing Ookii dialogs completely I guess, and using the new native net 8.0+ versions instead.
I don't think Ookii will be updating this, and I suspect wine won't consider it an issue.

You don't have filesystem access to the files (not even Explorer does), and open dialog will error on selection while selecting an encrypted Xbox Store exe.

Microsoft, WTF. lol

@Sewer56
Copy link
Member

Sewer56 commented Nov 23, 2025

I'd be more concerned about subtle bugs elsewhere, which we don't quite know about yet.

After all, a runtime upgrade broke this, not Proton.

So something runtime related was/is amiss.

@dreamsyntax
Copy link
Contributor Author

Created wine bug report
https://bugs.winehq.org/show_bug.cgi?id=59041

@dreamsyntax dreamsyntax force-pushed the NET10-TIME branch 3 times, most recently from e4f26fd to 024a217 Compare December 16, 2025 20:45
@dreamsyntax
Copy link
Contributor Author

Rebased. Will be using this build extensively on Windows.
Wine has resolved the bug above in 11.0-rc
Will still need to wait for Proton 11 to be common before merging this, but for testing on Windows its fine.

@dreamsyntax dreamsyntax marked this pull request as ready for review January 15, 2026 19:49
@coderabbitai
Copy link

coderabbitai bot commented Feb 12, 2026

📝 Walkthrough

Walkthrough

This pull request upgrades the entire codebase from .NET 9.0 to .NET 10.0. Changes include updating GitHub Actions workflows to install .NET 10.0 SDK, updating target frameworks across all project files, and bumping dependent package versions to compatible releases.

Changes

Cohort / File(s) Summary
GitHub Actions Workflows
.github/workflows/build-and-publish.yml, .github/workflows/reloaded-utils-server.yml
Added .NET 10.0 SDK setup step and updated workflow to use dotnet-version 10.0.x instead of 9.0.x.
Server & Utilities Projects
source/Mods/Reloaded.Utils.Server/Reloaded.Utils.Server.csproj, source/Reloaded.Mod.Loader.Server/Reloaded.Mod.Loader.Server.csproj
Updated TargetFramework/TargetFrameworks to net10.0 and bumped Microsoft.NET.ILLink.Tasks to version 10.0.0.
Installer Projects
source/Reloaded.Mod.Installer.Cli/...csproj, source/Reloaded.Mod.Installer.Lib/...csproj, source/Reloaded.Mod.Installer/...csproj
Updated TargetFrameworks from NET472;net9.0-windows to NET472;net10.0-windows and MSBuild PublishAot compatibility conditions.
Launcher Projects
source/Reloaded.Mod.Launcher.Lib/Reloaded.Mod.Launcher.Lib.csproj, source/Reloaded.Mod.Launcher/Reloaded.Mod.Launcher.csproj
Updated TargetFramework to net10.0-windows (net7.0 to net10.0 in Lib project). Upgraded McMaster.NETCore.Plugins from 2.0.0-beta.0 to 2.0.0.
Loader Projects
source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj, source/Reloaded.Mod.Loader.Tests/Reloaded.Mod.Loader.Tests.csproj
Updated TargetFramework to net10.0-windows, bumped ILLink.Tasks to 10.0.0, and removed RuntimeFrameworkVersion settings.
Build Configuration
source/Publish.ps1
Updated installer CLI target framework to net10.0-windows in build steps.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 Ten's the new nine, we hop with glee,
Framework upgraded across the tree,
From dotnet nine to ten we leap,
ILLink and Launcher dependencies deep,
A rabbit-approved modernization spree! 🚀

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title refers to .NET 10 upgrade being blocked by Linux support issues, which is a real aspect of the PR, but the primary changes are the .NET 10 upgrades themselves; the Linux blocker is contextual rather than the main change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into master
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj`:
- Around line 98-99: The project currently references McMaster.NETCore.Plugins
Version="2.0.0" which targets net8.0 while the project targets .NET 10; update
the PackageReference for McMaster.NETCore.Plugins to a version that explicitly
supports net10.0 (or remove/replace it) or add a comment and runtime
verification step to ensure compatibility, and keep Microsoft.NET.ILLink.Tasks
Version="10.0.0" as-is since it supports net10.0; locate the PackageReference
entries for "McMaster.NETCore.Plugins" and "Microsoft.NET.ILLink.Tasks" in
Reloaded.Mod.Loader.csproj and either bump McMaster.NETCore.Plugins to a
net10-compatible release or add a project-level compatibility test (or runtime
check) to validate the package works under .NET 10.
🧹 Nitpick comments (2)
source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj (2)

16-21: Pre-existing: duplicate CETCompat element.

Lines 16 and 21 both set <CETCompat>false</CETCompat>. This is harmless (last wins) but worth cleaning up while you're in this file.

🧹 Remove duplicate
     <Platforms>x86;x64</Platforms>
     <GenerateDepsJson>false</GenerateDepsJson>
     <DebugType>portable</DebugType>
     <!-- For backcompat with out of support versions of Windows -->
     <CETCompat>false</CETCompat>
-
-    <!-- IL Trimming Support forked from https://github.com/space-wizards/RobustToolbox, under the MIT License -->
+    <!-- IL Trimming Support forked from https://github.com/space-wizards/RobustToolbox, under the MIT License -->

Wait — both comments are relevant. Just remove the first <CETCompat> on line 16 and keep the one on line 21 that has the explanatory comment:

-    <CETCompat>false</CETCompat>
     <Platforms>x86;x64</Platforms>

5-7: Inconsistent indentation: mixed tabs and spaces.

Lines 5 and 7 use tabs while the rest of the file uses spaces. Consider normalizing for consistency.

Comment on lines 98 to +99
<PackageReference Include="McMaster.NETCore.Plugins" Version="2.0.0" />
<PackageReference Include="Microsoft.NET.ILLink.Tasks" Version="9.0.11" />
<PackageReference Include="Microsoft.NET.ILLink.Tasks" Version="10.0.0" />
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if these package versions exist on NuGet and get detailed info
echo "=== ILLink.Tasks versions ==="
curl -s "https://api.nuget.org/v3-flatcontainer/microsoft.net.illink.tasks/index.json" | jq '.versions | sort | .[-10:]'

echo -e "\n=== McMaster.NETCore.Plugins versions ==="
curl -s "https://api.nuget.org/v3-flatcontainer/mcmaster.netcore.plugins/index.json" | jq '.versions | sort | .[-10:]'

echo -e "\n=== ILLink.Tasks 10.0.0 metadata ==="
curl -s "https://api.nuget.org/v3-flatcontainer/microsoft.net.illink.tasks/10.0.0/microsoft.net.illink.tasks.nuspec" | grep -o '<dependency id="[^"]*" version="[^"]*"' | head -20

echo -e "\n=== McMaster.NETCore.Plugins 2.0.0 metadata ==="
curl -s "https://api.nuget.org/v3-flatcontainer/mcmaster.netcore.plugins/2.0.0/mcmaster.netcore.plugins.nuspec" | grep -o '<dependency id="[^"]*" version="[^"]*"' | head -20

Repository: Reloaded-Project/Reloaded-II

Length of output: 502


🏁 Script executed:

#!/bin/bash
# Check the actual project file to see what versions are specified
echo "=== Current project file content (lines 90-110) ==="
sed -n '90,110p' source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj

echo -e "\n=== Target framework ==="
grep -i "TargetFramework" source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj | head -5

# Search for ILLink.Tasks on NuGet for .NET 10 specifically
echo -e "\n=== Latest ILLink.Tasks versions (all) ==="
curl -s "https://api.nuget.org/v3-flatcontainer/microsoft.net.illink.tasks/index.json" | jq '.versions | reverse' | head -20

Repository: Reloaded-Project/Reloaded-II

Length of output: 1676


🏁 Script executed:

#!/bin/bash
# Get detailed package metadata for compatibility verification
echo "=== ILLink.Tasks 10.0.0 package info ==="
curl -s "https://api.nuget.org/v3-flatcontainer/microsoft.net.illink.tasks/10.0.0/microsoft.net.illink.tasks.nuspec" | grep -E "(<dependency|<group|framework)" | head -15

echo -e "\n=== McMaster.NETCore.Plugins 2.0.0 package info ==="
curl -s "https://api.nuget.org/v3-flatcontainer/mcmaster.netcore.plugins/2.0.0/mcmaster.netcore.plugins.nuspec" | grep -E "(<dependency|<group|framework)" | head -15

echo -e "\n=== Check for newer compatible versions ==="
echo "ILLink.Tasks available: 10.0.0, 10.0.1, 10.0.2, 10.0.3"
echo "McMaster.NETCore.Plugins: checking GitHub for .NET 10 support..."
curl -s "https://raw.githubusercontent.com/natemcmaster/DotNetCorePlugins/main/README.md" | grep -i "net10\|\.net 10\|framework" | head -10

Repository: Reloaded-Project/Reloaded-II

Length of output: 580


⚠️ McMaster.NETCore.Plugins 2.0.0 targets only .NET 8, not .NET 10.

ILLink.Tasks 10.0.0 is confirmed compatible—it explicitly supports net10.0. However, McMaster.NETCore.Plugins 2.0.0 targets only net8.0 according to its package metadata. While .NET 8 packages typically work in .NET 10 projects due to TFM forward compatibility, this should be verified at runtime or consider whether a newer version with explicit .NET 10 support exists.

🤖 Prompt for AI Agents
In `@source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj` around lines 98 - 99,
The project currently references McMaster.NETCore.Plugins Version="2.0.0" which
targets net8.0 while the project targets .NET 10; update the PackageReference
for McMaster.NETCore.Plugins to a version that explicitly supports net10.0 (or
remove/replace it) or add a comment and runtime verification step to ensure
compatibility, and keep Microsoft.NET.ILLink.Tasks Version="10.0.0" as-is since
it supports net10.0; locate the PackageReference entries for
"McMaster.NETCore.Plugins" and "Microsoft.NET.ILLink.Tasks" in
Reloaded.Mod.Loader.csproj and either bump McMaster.NETCore.Plugins to a
net10-compatible release or add a project-level compatibility test (or runtime
check) to validate the package works under .NET 10.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants