From 62ece0d92e1798f97e1b7618f6f04d495e16132d Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 24 Oct 2024 23:38:25 +0200 Subject: [PATCH] Fix crash when using attributes cache after hot-reload in editor --- .../Engine/Scripting/ManagedCLR/MAssembly.h | 1 + Source/Engine/Scripting/ManagedCLR/MEvent.h | 1 + Source/Engine/Scripting/ManagedCLR/MField.h | 1 + Source/Engine/Scripting/ManagedCLR/MMethod.h | 1 + .../Engine/Scripting/ManagedCLR/MProperty.h | 1 + Source/Engine/Scripting/Runtime/DotNet.cpp | 39 +++++++++++++++++++ 6 files changed, 44 insertions(+) diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.h b/Source/Engine/Scripting/ManagedCLR/MAssembly.h index 169cfd7e3..8e9b21509 100644 --- a/Source/Engine/Scripting/ManagedCLR/MAssembly.h +++ b/Source/Engine/Scripting/ManagedCLR/MAssembly.h @@ -14,6 +14,7 @@ /// class FLAXENGINE_API MAssembly { + friend MCore; friend MDomain; friend Scripting; diff --git a/Source/Engine/Scripting/ManagedCLR/MEvent.h b/Source/Engine/Scripting/ManagedCLR/MEvent.h index 5692f3dc6..5fe4da1a1 100644 --- a/Source/Engine/Scripting/ManagedCLR/MEvent.h +++ b/Source/Engine/Scripting/ManagedCLR/MEvent.h @@ -10,6 +10,7 @@ class FLAXENGINE_API MEvent { friend MClass; + friend MCore; protected: #if USE_MONO diff --git a/Source/Engine/Scripting/ManagedCLR/MField.h b/Source/Engine/Scripting/ManagedCLR/MField.h index 5475f4535..7c0d89287 100644 --- a/Source/Engine/Scripting/ManagedCLR/MField.h +++ b/Source/Engine/Scripting/ManagedCLR/MField.h @@ -11,6 +11,7 @@ class FLAXENGINE_API MField { friend MClass; + friend MCore; protected: #if USE_MONO diff --git a/Source/Engine/Scripting/ManagedCLR/MMethod.h b/Source/Engine/Scripting/ManagedCLR/MMethod.h index f2b127871..4731e0723 100644 --- a/Source/Engine/Scripting/ManagedCLR/MMethod.h +++ b/Source/Engine/Scripting/ManagedCLR/MMethod.h @@ -16,6 +16,7 @@ class FLAXENGINE_API MMethod friend MClass; friend MProperty; friend MEvent; + friend MCore; protected: #if USE_MONO diff --git a/Source/Engine/Scripting/ManagedCLR/MProperty.h b/Source/Engine/Scripting/ManagedCLR/MProperty.h index dbbed8ab3..975d62b8c 100644 --- a/Source/Engine/Scripting/ManagedCLR/MProperty.h +++ b/Source/Engine/Scripting/ManagedCLR/MProperty.h @@ -12,6 +12,7 @@ class FLAXENGINE_API MProperty { friend MClass; + friend MCore; protected: #if USE_MONO diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp index 4a71e9c2f..38df5c16f 100644 --- a/Source/Engine/Scripting/Runtime/DotNet.cpp +++ b/Source/Engine/Scripting/Runtime/DotNet.cpp @@ -336,7 +336,46 @@ void MCore::ReloadScriptingAssemblyLoadContext() { // Clear any cached class attributes (see https://github.com/FlaxEngine/FlaxEngine/issues/1108) for (auto e : CachedClassHandles) + { + e.Value->_hasCachedAttributes = false; e.Value->_attributes.Clear(); + } + for (auto e : CachedAssemblyHandles) + { + MAssembly* a = e.Value; + if (!a->IsLoaded() || !a->_hasCachedClasses) + continue; + for (auto q : a->GetClasses()) + { + MClass* c = q.Value; + c->_hasCachedAttributes = false; + c->_attributes.Clear(); + if (c->_hasCachedMethods) + { + for (MMethod* m : c->GetMethods()) + { + m->_hasCachedAttributes = false; + m->_attributes.Clear(); + } + } + if (c->_hasCachedFields) + { + for (MField* f : c->GetFields()) + { + f->_hasCachedAttributes = false; + f->_attributes.Clear(); + } + } + if (c->_hasCachedProperties) + { + for (MProperty* p : c->GetProperties()) + { + p->_hasCachedAttributes = false; + p->_attributes.Clear(); + } + } + } + } static void* ReloadScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("ReloadScriptingAssemblyLoadContext")); CallStaticMethod(ReloadScriptingAssemblyLoadContextPtr);