.net 10 laat niet langer toe om BinaryFormatter te gebruiken. Dit om veiligheidsredenen die op deze pagina worden gedocumenteerd. Dit is niet iets dat door Mercator wordt opgelegd, maar door het .net-ontwikkelingsteam van Microsoft.
Deze beperking kan volgende fout veroorzaken:
System.NotSupportedException: BinaryFormatter serialization and deserialization are disabled within this application.
Dit kan zich voordoen in maatwerkontwikkelingen die door Mercator worden aangeroepen, wanneer deze afbeeldingen, iconen, ... bevatten in resources die via ResourceManager worden beheerd. Het gaat dan om .resx-bestanden.
In de call stack van de fout is het beginpunt meestal een regel zoals deze
System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)
Oplossing 1: het project wijzigen
Als het resx-bestand afbeeldingen of iconen bevat, volstaat het om het project opnieuw te compileren met:
<TargetFramework>net10.0-windows</TargetFramework>
Indien van toepassing, als Mercator Core nog steeds hybride wordt gebruikt met de klassieke versie, moet een multi-target-project worden opgezet.
<TargetFrameworks>net48;net10.0-windows</TargetFrameworks>
Deze hercompilatie met .net10 zet een nieuwe resource-pipeline op die geen gebruik meer maakt van BinaryFormatter.
💡 Hiervoor moet het csproj-projectbestand worden geconverteerd naar het SDK-formaat als het nog in het oude formaat staat.
Oplossing 2: de code wijzigen
Deze alternatieve werkwijze kan ook worden gebruikt. Ze vereist geen wijziging van het project. Hierbij worden de resources verwijderd die de uitzondering veroorzaken.
Bewerk de verschillende .resx-bestanden (openen met “XML Text Editor”) en zoek de probleemregels die GetObject bevatten.
Daar kan een regel voorkomen zoals deze:
<data name="pictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1...
</value>
Kopieer de waarde van de afbeelding die is uitgedrukt als base64-tekenreeks (tussen <value> en </value>).
Zoek vervolgens de overeenkomstige regel in het .Designer.cs-bestand. Deze bevat GetObject. Kopieer deze regel en verwijder ze daarna.
Plak deze regel in de basis source-code van de Form of de UserControl, onder de regel InitializeComponent(). Vervang het deel rechts van het = teken door
= MercatorApi.Api.Base64StringToImage(@"
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1...");
Als het om een icoon gaat, gebruik dan de methode Api.Base64StringToIcon.
Als de resource van het type System.Resources.ResXFileRef is, betekent dit dat er een bestand met de afbeelding of het icoon in het project bestaat. Zoek dit bestand en stel "Embedded Resource" in als "Build Action".
Verwijder de resource.
Zoek vervolgens de overeenkomstige regel in het .Designer.cs-bestand. Deze bevat GetObject. Kopieer deze regel en verwijder ze.
Plak deze regel in de basis source-code van de Form of de UserControl, onder de regel InitializeComponent(). Vervang het deel rechts van het = teken door
= MercatorApi.Api.EmbeddedResourceToImage("MyNameSpace.MyImage.png");
Als het om een icoon gaat, gebruik dan de methode MercatorApi.Api.EmbeddedResourceToIcon.
Als het resx-bestand andere types bevat die BinaryFormatter nodig hebben om gedeserialiseerd te worden, moeten deze resources worden verwijderd en moet de code anders worden georganiseerd.
Zie ook deze pagina.