Skip to content

BinaryFormatter deprecation issue while using PythonEngine.Shutdown() #2469

@Kaz8939

Description

@Kaz8939

Environment

  • Pythonnet version: 3.0.4
  • Python version: 3.11
  • Operating System: Windows 10
  • .NET Runtime: .NET8/netstandard 2.0

Details

Hi, I am facing a known issue with PythonEngine.Shutdown() that should have been solved. I saw looking around here that many others have had a problem while using the Shutdown function since it caused an exception due to the deprecation of BinaryFormatter in .NET8.
Here the exception I am getting:

System.NotSupportedException: 'BinaryFormatter serialization and deserialization are disabled within this application. See https://aka.ms/binaryformatter for more information.'

I am aware of the workarounds already provided such as the management of "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization" parameter, if I manually manage this set the issue is not presenting anymore, but it seems to me that is more of a patch than a fix.

Since .NET9 will totally get rid of BinaryFormatter, and since I read in other threads that this issue should have been fixed, I was wondering if I was missing something or if the only way to manage this is by manually managing the serialization parameter.

Here follows the code I am using (in a project that targets netstandard2.0, while it is called by a .NET8 project).

using Python.Runtime;
using System;
using System.IO;

namespace ExecutePython
{
    public class Class1
    {
        string filePath;
        
        public Class1(string FilePath) 
        { 
            filePath = FilePath;
            Initialize();
        }

        public void Initialize()
        {
            string pythonDll = @"C:\Users\MyUser\AppData\Local\Programs\Python\Python311\python311.dll";
            Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", pythonDll);
            PythonEngine.Initialize();
        }
        public void ExecutePython()
        {
            string pyCode = File.ReadAllText(filePath);

            using (Py.GIL())
            {
                try
                {
                    PythonEngine.Exec(pyCode);
                }
                catch (Exception ex)
                {
                    //log error
                }
            }
            
            try
            {
                //AppContext.SetSwitch("System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization", true);
                PythonEngine.Shutdown();  
                //AppContext.SetSwitch("System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization", false);
            }
            catch (Exception e)
            { }
        }
    }
}

The code that is executing correctly in my python script is a sample code, in my case it just pops up a window to see that the script is executing correctly

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions