Fix scripting AssemblyLoadContext not getting unloaded
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -330,9 +330,15 @@ 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)
|
||||
@@ -377,8 +383,8 @@ void MCore::ReloadScriptingAssemblyLoadContext()
|
||||
}
|
||||
}
|
||||
|
||||
static void* ReloadScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("ReloadScriptingAssemblyLoadContext"));
|
||||
CallStaticMethod<void>(ReloadScriptingAssemblyLoadContextPtr);
|
||||
static void* UnloadScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("UnloadScriptingAssemblyLoadContext"));
|
||||
CallStaticMethod<void>(UnloadScriptingAssemblyLoadContextPtr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -715,9 +715,13 @@ void MCore::UnloadEngine()
|
||||
#endif
|
||||
}
|
||||
|
||||
void MCore::CreateScriptingAssemblyLoadContext()
|
||||
{
|
||||
}
|
||||
|
||||
#if USE_EDITOR
|
||||
|
||||
void MCore::ReloadScriptingAssemblyLoadContext()
|
||||
void MCore::UnloadScriptingAssemblyLoadContext()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,13 @@ void MCore::UnloadEngine()
|
||||
MRootDomain = nullptr;
|
||||
}
|
||||
|
||||
void MCore::CreateScriptingAssemblyLoadContext()
|
||||
{
|
||||
}
|
||||
|
||||
#if USE_EDITOR
|
||||
|
||||
void MCore::ReloadScriptingAssemblyLoadContext()
|
||||
void MCore::UnloadScriptingAssemblyLoadContext()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -182,6 +182,8 @@ bool ScriptingService::Init()
|
||||
return true;
|
||||
}
|
||||
|
||||
MCore::CreateScriptingAssemblyLoadContext();
|
||||
|
||||
// Cache root domain
|
||||
_rootDomain = MCore::GetRootDomain();
|
||||
|
||||
@@ -710,7 +712,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();
|
||||
|
||||
Reference in New Issue
Block a user