From 77b6a4a68b3725dee0a50ecce222af88954a99dd Mon Sep 17 00:00:00 2001 From: SS Date: Tue, 7 Nov 2023 16:03:03 -0700 Subject: [PATCH] Fixed issue in NativeInterop Readded check in current app domain to ExtendedSerializationBinder --- Source/Engine/Engine/NativeInterop.cs | 11 +++++-- .../ExtendedSerializationBinder.cs | 33 ++++++++++++------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index 28ac5024d..b4635e0b4 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -317,11 +317,16 @@ namespace FlaxEngine.Interop /// The resolved assembly, or null if none could be found. internal static Assembly ResolveScriptingAssemblyByName(AssemblyName assemblyName, bool allowPartial = false) { - foreach (Assembly assembly in scriptingAssemblyLoadContext.Assemblies) + var lc = scriptingAssemblyLoadContext; + + if (lc is null) + return null; + + foreach (Assembly assembly in lc.Assemblies) { var curName = assembly.GetName(); - if (curName == assemblyName || (allowPartial && curName.Name == assemblyName.Name)) + if (curName == assemblyName) return assembly; } @@ -329,7 +334,7 @@ namespace FlaxEngine.Interop { string partialName = assemblyName.Name; - foreach (Assembly assembly in scriptingAssemblyLoadContext.Assemblies) + foreach (Assembly assembly in lc.Assemblies) { var curName = assembly.GetName(); diff --git a/Source/Engine/Serialization/JsonCustomSerializers/ExtendedSerializationBinder.cs b/Source/Engine/Serialization/JsonCustomSerializers/ExtendedSerializationBinder.cs index 5f976f24f..8199a2bd9 100644 --- a/Source/Engine/Serialization/JsonCustomSerializers/ExtendedSerializationBinder.cs +++ b/Source/Engine/Serialization/JsonCustomSerializers/ExtendedSerializationBinder.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Reflection; using System.Runtime.Serialization; using FlaxEngine.Interop; @@ -56,13 +57,13 @@ namespace FlaxEngine.Json.JsonCustomSerializers if (type is null && key.assemblyName is not null) { // Type not found yet, but we have assembly name Assembly? assembly = null; - assembly = FindScriptingAssembly(key.assemblyName); // Attempt to load from scripting assembly + assembly = FindScriptingAssembly(new(key.assemblyName)); // Attempt to find in scripting assemblies if (assembly is null) - assembly = FindLoadedAssembly(key.assemblyName); // Attempt to load from loaded assemblies + assembly = FindLoadAssembly(new(key.assemblyName)); // Attempt to load if (assembly is null) - assembly = FindUnloadedAssembly(key.assemblyName); // Attempt to load from unloaded assemblies + assembly = FindDomainAssembly(new(key.assemblyName)); // Attempt to find in the current domain if (assembly is null) throw MakeAsmResolutionException(key.assemblyName); // Assembly failed to resolve @@ -80,27 +81,35 @@ namespace FlaxEngine.Json.JsonCustomSerializers } /// Attempt to find the assembly among loaded scripting assemblies - Assembly? FindScriptingAssembly(string assemblyName) + Assembly? FindScriptingAssembly(AssemblyName assemblyName) { - return NativeInterop.ResolveScriptingAssemblyByName(new AssemblyName(assemblyName), allowPartial: true); + return NativeInterop.ResolveScriptingAssemblyByName(assemblyName, allowPartial: true); } - /// Attempt to find the assembly by name - Assembly? FindLoadedAssembly(string assemblyName) // TODO + /// Attempt to find the assembly in the current domain + Assembly? FindDomainAssembly(AssemblyName assemblyName) { + var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToArray(); + + foreach (Assembly assembly in assemblies) { + var curName = assembly.GetName(); + + if (curName == assemblyName || curName.Name == assemblyName.Name) + return assembly; + } + return null; } - /// Attempt to find the assembly by name - Assembly? FindUnloadedAssembly(string assemblyName) + /// Attempt to load the assembly + Assembly? FindLoadAssembly(AssemblyName assemblyName) { Assembly? assembly = null; - assembly = Assembly.Load(new AssemblyName(assemblyName)); + assembly = Assembly.Load(assemblyName); if (assembly is null) - assembly = Assembly.LoadWithPartialName(assemblyName); // Copying behavior of DefaultSerializationBinder - + assembly = Assembly.LoadWithPartialName(assemblyName.Name); // Copying behavior of DefaultSerializationBinder return assembly; }