Fix scripting AssemblyLoadContext not getting unloaded

# Conflicts:
#	Source/Engine/Engine/NativeInterop.Managed.cs
This commit is contained in:
2024-04-22 00:11:24 +03:00
parent c16ec763c2
commit 25036be05f
8 changed files with 156 additions and 55 deletions

View File

@@ -45,9 +45,16 @@ public:
/// </summary>
static void UnloadEngine();
/// <summary>
/// Creates the assembly load context for assemblies used by Scripting.
/// </summary>
static void CreateScriptingAssemblyLoadContext();
#if USE_EDITOR
// Called by Scripting in a middle of hot-reload (after unloading modules but before loading them again).
static void ReloadScriptingAssemblyLoadContext();
/// <summary>
/// Called by Scripting in a middle of hot-reload (after unloading modules but before loading them again).
/// </summary>
static void UnloadScriptingAssemblyLoadContext();
#endif
public:

View File

@@ -320,16 +320,22 @@ void MCore::UnloadEngine()
ShutdownHostfxr();
}
void MCore::CreateScriptingAssemblyLoadContext()
{
static void* CreateScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("CreateScriptingAssemblyLoadContext"));
CallStaticMethod<void>(CreateScriptingAssemblyLoadContextPtr);
}
#if USE_EDITOR
void MCore::ReloadScriptingAssemblyLoadContext()
void MCore::UnloadScriptingAssemblyLoadContext()
{
// Clear any cached class attributes (see https://github.com/FlaxEngine/FlaxEngine/issues/1108)
for (auto e : CachedClassHandles)
e.Value->_attributes.Clear();
static void* ReloadScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("ReloadScriptingAssemblyLoadContext"));
CallStaticMethod<void>(ReloadScriptingAssemblyLoadContextPtr);
static void* UnloadScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("UnloadScriptingAssemblyLoadContext"));
CallStaticMethod<void>(UnloadScriptingAssemblyLoadContextPtr);
}
#endif

View File

@@ -715,9 +715,13 @@ void MCore::UnloadEngine()
#endif
}
void MCore::CreateScriptingAssemblyLoadContext()
{
}
#if USE_EDITOR
void MCore::ReloadScriptingAssemblyLoadContext()
void MCore::UnloadScriptingAssemblyLoadContext()
{
}

View File

@@ -58,9 +58,13 @@ void MCore::UnloadEngine()
MRootDomain = nullptr;
}
void MCore::CreateScriptingAssemblyLoadContext()
{
}
#if USE_EDITOR
void MCore::ReloadScriptingAssemblyLoadContext()
void MCore::UnloadScriptingAssemblyLoadContext()
{
}

View File

@@ -175,6 +175,8 @@ bool ScriptingService::Init()
return true;
}
MCore::CreateScriptingAssemblyLoadContext();
// Cache root domain
_rootDomain = MCore::GetRootDomain();
@@ -703,7 +705,8 @@ void Scripting::Reload(bool canTriggerSceneReload)
_hasGameModulesLoaded = false;
// Release and create a new assembly load context for user assemblies
MCore::ReloadScriptingAssemblyLoadContext();
MCore::UnloadScriptingAssemblyLoadContext();
MCore::CreateScriptingAssemblyLoadContext();
// Give GC a try to cleanup old user objects and the other mess
MCore::GC::Collect();