Rhino 9 WIP (9.0.26300.9401): C# script fails in .NET Core mode

n Rhino 9.0.26300.9401, any C# script fails to run when the runtime is set to .NET Core. With SetDotNetRuntime set to .NET Framework, the same script runs fine.

Minimal script:

csharp

using Rhino;
using Rhino.UI;
Dialogs.ShowMessage("Hello", "Hello");

Error
FileLoadException: Could not load file or assembly 'System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Could not find or load a specific file. (0x80131621)

The Rhino log also shows the C# completion provider failing, CSharpCodeScriptTransformer.Transform failing, and stub building failing for Microsoft.CodeAnalysis 5.0.0.0 and System.Management 10.0.0.0 (System.CodeDom 10.0.0.0 not found).

Findings

  • Runtime reported by Python 3 in Rhino: .NET 8.0.33
  • C:\Program Files\Rhino 9\System\netcore\System.Collections.Immutable.dll has file version 10
  • Roslyn (Microsoft.CodeAnalysis 5.0.0.0) requests 9.0.0.0, the resolver asks for 10.0.0.0, while the host is .NET 8
  • System .NET runtimes installed: 8.0.33, 9.0.17, 10.0.14 (x64)

It looks like the netcore folder ships .NET 9/10 assemblies while the host runs .NET 8.

System info: (paste _SystemInfo output)
Full log attached.

Rhino 9 SR0 2026-10-27 (Rhino 9, 9.0.26300.09401, Git hash:master @ b5c4aa079c11dd91ccd7b6aa067f5029f3fccf72)
License type: Evaluation, build 2026-10-27
License details: Cloud Zoo
Expires on: 2027-01-28

Windows 11 (10.0.26200 SR0.0) or greater (Physical RAM: 32GB)
.NET 8.0.33

Computer platform: DESKTOP

Standard graphics configuration using DirectX
Primary display: NVIDIA RTX A4000 (NVidia) Memory: 16GB, Driver date: 9-4-2026 (M-D-Y). DirectX(11)

Accelerated graphics device with 4 adapter port(s)

  • Windows Main Display attached to adapter port 0

Secondary graphics devices.
None found.

DirectX Settings
Safe mode: Off

OpenBLAS: OpenBLAS 0.3.30 DYNAMIC_ARCH NO_AFFINITY SkylakeX MAX_THREADS=64.

Rhino plugins that do not ship with Rhino
D:\JFR8.0\8.0sr3\JFRGemCoolHelpe.rhp “JFRGemCoolHelpe” 1.0.0.0
D:\JFR8.0\8.0sr3\ARingSize.rhp “JFR” 1.0.0.0
C:\Program Files\Common Files\McNeel\Rhinoceros\7.0\Plug-ins\ElefrontProperties (5db9285b-b408-41e2-b815-ed6ad84fd4a9)\1.0.0.0\Rhino 6\ElefrontProperties.rhp “ElefrontProperties” 1.0.0.0
D:\JFR8.0\8.0sr3\JewellyForRhino.rhp “JewellyForRhino”
C:\Users\Riccardo\Google Drive\Progetti VS2015\RhinoJobs\bin\RhinoJobs.rhp “RhinoJobs” 1.0.0.0
D:\JFR8.0\8.0sr3\JFR_renderc.rhp “JFR_renderc” 1.0.0.0
C:\ProgramData\McNeel\Rhinoceros\packages\9.0\Grasshopper_Gold_Tools\1.0\Grasshopper_Gold_Tools.rhp “Grasshopper_Gold_Tools” 2.0.0.0

Rhino plugins that ship with Rhino
C:\Program Files\Rhino 9\Plug-ins\Commands.rhp “Commands” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\rdk.rhp “Renderer Development Kit”
C:\Program Files\Rhino 9\Plug-ins\RhinoAI\net8.0\RhinoAI.rhp “RhinoAI” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\3dxRhino.9.rhp “3DxRhino.9”
C:\Program Files\Rhino 9\Plug-ins\UpdatesAndStatistics\UpdatesAndStatistics.rhp “UpdatesAndStatistics” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\RhinoRenderCycles.rhp “Rhino Render” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\rdk_etoui.rhp “RDK_EtoUI” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\NamedSnapshots.rhp “Snapshots”
C:\Program Files\Rhino 9\Plug-ins\MeshCommands.rhp “MeshCommands” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\RhinoCycles.rhp “RhinoCycles” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\RhinoCode\RhinoCodePlugin.rhp “RhinoCodePlugin” 9.0.26300.9401
C:\Program Files\Rhino 9\Plug-ins\Displacement.rhp “Displacement”
C:\Program Files\Rhino 9\Plug-ins\SectionTools.rhp “SectionTools”

Grazie Riccardo

@curtisw - can you have a look at this?

Hey @creation,

Rhino 9 should be running with .NET 10, not .NET 8. Are you forcing that with a /netcore-8 switch or have set that in the past with SetDotNetRuntime?

We have dropped support for .NET 8 in Rhino 9 since .NET 8 is out of support as of next month.

Hi @curtisw ,

Thanks, that was it. I had not set /netcore-8 in any shortcut, but the registry still had a leftover value from earlier testing:

[HKEY_CURRENT_USER\Software\McNeel\Rhinoceros\9.0\Global Options]
"DotNetRuntime"=""
"DotNetCoreVersion"="8"

Rhino 9 has no UI to change the .NET Core version (as you said, .NET 8 is no longer supported), so SetDotNetRuntime could not override it. It only offered NETCore/NETFramework, and Rhino kept reporting .NET 8.0.33.

After closing Rhino and deleting the DotNetCoreVersion value, Rhino 9 now starts on .NET 10:

Command: _SetDotNetRuntime
Currently running in .NET 10.0.14

This also explains the original errors: System.Collections.Immutable 9/10 (and System.CodeDom 10) could not be loaded by Roslyn because the host process was running .NET 8, so every C# script failed, even a one-line Dialogs.ShowMessage. With .NET Framework selected it worked, since Roslyn did not go through the .NET 8 host.

One suggestion: since the value silently stays in the registry, it might be worth having Rhino 9 ignore or clear a stale DotNetCoreVersion=8 (or show a warning), because users coming from Rhino 8 who changed it will hit the same cryptic FileLoadException with no way to fix it from the UI.

Thanks again for the quick help!

Hi Riccardo -

I forced Rhino 9 to run with .NET 8 by adding the /netcore-8 switch. I then used SetDotNetRuntime to change to NETFramework and restarted Rhino. I then switched back to NETCore and restarted.
At that point, Rhino was running with .NET 10.

I’m not sure if you are saying that you had tried that and it didn’t work?
-wim

Hi Wim,

Yes, I did try exactly that sequence: SetDotNetRuntime to NETFramework, restart, then back to NETCore, restart. Rhino 9 still reported:

Command: _SetDotNetRuntime
Currently running in .NET 8.0.33

At that point the registry had this under HKCU\Software\McNeel\Rhinoceros\9.0\Global Options:

"DotNetRuntime"=""
"DotNetCoreVersion"="8"

I never added /netcore-8 to a shortcut myself, so I don’t know where the 8 came from (maybe an old test, or carried over from Rhino 8). After I deleted the DotNetCoreVersion value manually and restarted, Rhino 9 started on .NET 10.0.14.

So on my machine, toggling between NETFramework and NETCore did not clear or override the stored version, even though it did for you. I can’t tell why the behavior differs. If it helps, I can put the value back and repeat the test, or send more details (Rhino build 9.0.26300.9401, Windows version, and the full registry key).

Thanks for your help!

Hi Riccardo -

Thanks for confirming that. I’ve put this on @curtisw list for a closer look:
→ RH-99948 DotNET: Ensure Correct Setting through UI
-wim

Thanks Wim, much appreciated!