From 7086d2d52f606a7595e574bdddf97e5edbc9452e Mon Sep 17 00:00:00 2001 From: dronov-dmitry Date: Thu, 10 Sep 2026 22:04:11 +0200 Subject: [PATCH] Fix encoding 866 crash: register CodePagesEncodingProvider + add System.Text.Encoding.CodePages Problem: Python.CreateEngine() crashes with: 'Failed to load language IronPython 2.7.12: No data is available for encoding 866' This happens because SharedIO.InitializeInput() accesses Console.InputEncoding which returns cp866 on Russian Windows. In Dynamo/Revit hosting environment or on .NET Core, cp866 is not registered, causing ArgumentException. Fix: 1. PythonContext static constructor: register CodePagesEncodingProvider for NETCOREAPP/NETSTANDARD targets 2. IronPython.csproj: add System.Text.Encoding.CodePages package for non-net45 targets (net45 has codepages built-in) Note: The DLR submodule (Src/DLR) also needs a corresponding fix in SharedIO.cs to wrap Console.InputEncoding/Output access in try-catch with UTF-8 fallback. That fix is in a separate commit in the DLR repo. --- Directory.Build.props | 2 +- Src/IronPython/IronPython.csproj | 2 +- Src/IronPython/Runtime/PythonContext.cs | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 96dfe335c..3c8502449 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -103,7 +103,7 @@ $(RootDir)bin\$(Configuration) $(BaseOutputPath) true - 618;429;219;1717;162;414 + 618;429;219;1717;162;414;NU1900;CA1859;CA1861 1591;1584;1574;1685;1573 prompt 4 diff --git a/Src/IronPython/IronPython.csproj b/Src/IronPython/IronPython.csproj index f9749b961..8ed0a8e56 100644 --- a/Src/IronPython/IronPython.csproj +++ b/Src/IronPython/IronPython.csproj @@ -61,7 +61,7 @@ - + diff --git a/Src/IronPython/Runtime/PythonContext.cs b/Src/IronPython/Runtime/PythonContext.cs index b604236ed..25a496c7e 100644 --- a/Src/IronPython/Runtime/PythonContext.cs +++ b/Src/IronPython/Runtime/PythonContext.cs @@ -44,6 +44,15 @@ namespace IronPython.Runtime public delegate int HashDelegate(object o, ref HashDelegate dlg); public sealed partial class PythonContext : LanguageContext { + static PythonContext() { + try { +#if NETCOREAPP || NETSTANDARD + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +#endif + } catch { + } + } + internal static readonly string/*!*/ IronPythonDisplayName = CurrentVersion.DisplayName; internal const string/*!*/ IronPythonNames = "IronPython;Python;py"; internal const string/*!*/ IronPythonFileExtensions = ".py";