Depuis le passage en .net10 : erreur sur BinaryFormatter

0000003399     -      27/11/2025

.net 10 ne permet plus d'utiliser le BinaryFormatter. Ceci pour des raisons de sécurité documentées sur cette page. Ceci n'est pas du fait de Mercator, mais est imposé par l'équipe de développement .net chez Microsoft.

Cette restriction peut provoquer cette erreur :

System.NotSupportedException: BinaryFormatter serialization and deserialization are disabled within this application.

Elle peut se rencontrer dans des développements sur mesure appelés par Mercator si ceux-ci contiennent des images, des icônes, ... dans des ressources gérées par ResourceManager. Il s'agit de fichiers .resx.

Dans la pile d'erreur, le point de départ est en général une ligne comme celle-ci

System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)

 

Solution 1 : modifier le projet

Si le fichier resx contient des images ou des icônes, il suffit de recompiler le projet avec :

<TargetFramework>net10.0-windows</TargetFramework>

 Le cas échéant, si Mercator Core est toujours utilisé de façon hybride avec la version classique, il faut alors mettre en place un projet multi-targets.

<TargetFrameworks>net48;net10.0-windows</TargetFrameworks>

Cette recompilation via .net10 va mettre en place un nouveau pipeline de fourniture de ressources qui n'utilise plus le BinaryFormatter.

💡 Ceci requiert de convertir le projet csproj au format SDK s'il est encore à l'ancien format.

 

Solution 2 : modifier le code

Cette autre façon de procéder peut être utilisée. Elle ne requiert pas de modification du projet. Elle consiste à retirer les ressources qui provoquent l'exception.

Il faut éditer les différents fichiers .resx (ouvrir avec "XML Text Editor") et localiser les lignes problématiques qui contiennent GetObject

On peut y trouver une ligne comme celle-ci :

  <data name="pictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1...
    </value>

Il faut copier la valeur de l'image exprimée sous la forme d'une chaîne base64 (entre <value> et </value>)

Ensuite, localiser la ligne correspondante dans le fichier .Designer.cs. Elle contient GetObject. Copier et retirer cette ligne.

Dans le code-source de base de la Form ou du UserControl, sous la ligne InitializeComponent(), coller cette ligne. Remplacer la partie à droite du signe = par 

Zoom
= MercatorApi.Api.Base64StringToImage(@"
                iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1...");

S'il s'agit d'une icône, utilisez la méthode Api.Base64StringToIcon.

 

Si la ressource est de type System.Resources.ResXFileRef, cela signifie qu'un fichier contenant l'image ou l'icône existe dans le projet. Localisez ce fichier et donnez-lui "Embedded Resource" en tant que "Build Action".

Supprimez la ressource.

Ensuite, localisez la ligne correspondante dans le fichier .Designer.cs. Elle contient GetObject. Copier et retirer cette ligne.

Dans le code-source de base de la Form ou du UserControl, sous la ligne InitializeComponent(), coller cette ligne. Remplacer la partie à droite du signe = par 

Zoom
= MercatorApi.Api.EmbeddedResourceToImage("MyNameSpace.MyImage.png");

S'il s'agit d'une icône, utilisez la méthode MercatorApi.Api.EmbeddedResourceToIcon.

 


Si un fichier resx contient d'autres types qui requièrent le BinaryFormatter pour être désérialisé, il faut supprimer ces ressources et organiser le code différemment.

Voir aussi cette page.



Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)