From 6379171fa6af794ce54187140c656829a3bf722b Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 29 Oct 2022 18:56:21 +0200 Subject: [PATCH] Fix crash due to bdb69d57dd4cc37513105d1c6ecb8b59f7c66647 (Mono typenames are invalid after dll unloaded) --- Source/Engine/Scripting/BinaryModule.cpp | 12 ++++++++++-- Source/Engine/Scripting/BinaryModule.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index 8a7f8ddbe..1fd9517da 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -697,6 +697,7 @@ ManagedBinaryModule::ManagedBinaryModule(MAssembly* assembly) // Bind for C# assembly events assembly->Loading.Bind(this); assembly->Loaded.Bind(this); + assembly->Unloading.Bind(this); assembly->Unloaded.Bind(this); if (Assembly->IsLoaded()) @@ -1095,17 +1096,24 @@ void ManagedBinaryModule::InitType(MClass* mclass) #endif } -void ManagedBinaryModule::OnUnloaded(MAssembly* assembly) +void ManagedBinaryModule::OnUnloading(MAssembly* assembly) { PROFILE_CPU(); - // Clear managed-only types + // Clear managed types typenames for (int32 i = _firstManagedTypeIndex; i < Types.Count(); i++) { const ScriptingType& type = Types[i]; const MString typeName(type.Fullname.Get(), type.Fullname.Length()); TypeNameToTypeIndex.Remove(typeName); } +} + +void ManagedBinaryModule::OnUnloaded(MAssembly* assembly) +{ + PROFILE_CPU(); + + // Clear managed-only types Types.Resize(_firstManagedTypeIndex); for (int32 i = 0; i < _managedMemoryBlocks.Count(); i++) Allocator::Free(_managedMemoryBlocks[i]); diff --git a/Source/Engine/Scripting/BinaryModule.h b/Source/Engine/Scripting/BinaryModule.h index ede625cc1..7c69a2dc6 100644 --- a/Source/Engine/Scripting/BinaryModule.h +++ b/Source/Engine/Scripting/BinaryModule.h @@ -309,6 +309,7 @@ private: void OnLoading(MAssembly* assembly); void OnLoaded(MAssembly* assembly); void InitType(MClass* mclass); + void OnUnloading(MAssembly* assembly); void OnUnloaded(MAssembly* assembly); public: