diff --git a/Source/Engine/Engine/NativeInterop.Unmanaged.cs b/Source/Engine/Engine/NativeInterop.Unmanaged.cs index 4ca783834..f1de3ecb3 100644 --- a/Source/Engine/Engine/NativeInterop.Unmanaged.cs +++ b/Source/Engine/Engine/NativeInterop.Unmanaged.cs @@ -1006,7 +1006,7 @@ namespace FlaxEngine.Interop } [UnmanagedCallersOnly] - internal static void ReloadScriptingAssemblyLoadContext() + internal static void LoadScriptingAssemblyLoadContext() { #if FLAX_EDITOR // Clear all caches which might hold references to assemblies in collectible ALC @@ -1030,16 +1030,18 @@ namespace FlaxEngine.Interop FlaxEngine.Json.JsonSerializer.ResetCache(); // Unload the ALC - bool unloading = true; - scriptingAssemblyLoadContext.Unloading += (alc) => { unloading = false; }; - scriptingAssemblyLoadContext.Unload(); - - while (unloading) - System.Threading.Thread.Sleep(1); + if (scriptingAssemblyLoadContext != null) + { + bool unloading = true; + scriptingAssemblyLoadContext.Unloading += (alc) => { unloading = false; }; + scriptingAssemblyLoadContext.Unload(); + while (unloading) + System.Threading.Thread.Sleep(1); + } +#endif InitScriptingAssemblyLoadContext(); DelegateHelpers.InitMethods(); -#endif } [UnmanagedCallersOnly] diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index 162334112..ac1d092ac 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -92,8 +92,6 @@ namespace FlaxEngine.Interop System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; - InitScriptingAssemblyLoadContext(); - DelegateHelpers.InitMethods(); } #if FLAX_EDITOR diff --git a/Source/Engine/Renderer/Renderer.cpp b/Source/Engine/Renderer/Renderer.cpp index 8b97bc1d5..77193c462 100644 --- a/Source/Engine/Renderer/Renderer.cpp +++ b/Source/Engine/Renderer/Renderer.cpp @@ -110,6 +110,9 @@ bool RendererService::Init() } } + // TODO: move it somewhere to game instance class or similar + MainRenderTask::Instance = New(); + return false; } diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.h b/Source/Engine/Scripting/ManagedCLR/MCore.h index 5352a4b29..d69ce104f 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.h +++ b/Source/Engine/Scripting/ManagedCLR/MCore.h @@ -45,10 +45,8 @@ public: /// static void UnloadEngine(); -#if USE_EDITOR - // Called by Scripting in a middle of hot-reload (after unloading modules but before loading them again). - static void ReloadScriptingAssemblyLoadContext(); -#endif + // Called by Scripting during initialization or in a middle of hot-reload (after unloading modules but before loading them again). + static void LoadScriptingAssemblyLoadContext(); public: /// diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp index 01b43c049..66d80dd7c 100644 --- a/Source/Engine/Scripting/Runtime/DotNet.cpp +++ b/Source/Engine/Scripting/Runtime/DotNet.cpp @@ -269,6 +269,8 @@ bool MCore::LoadEngine() // Prepare managed side CallStaticMethod(GetStaticMethodPointer(TEXT("Init"))); + MCore::LoadScriptingAssemblyLoadContext(); + #ifdef MCORE_MAIN_MODULE_NAME // MCORE_MAIN_MODULE_NAME define is injected by Scripting.Build.cs on platforms that use separate shared library for engine symbols ::String flaxLibraryPath(Platform::GetMainDirectory() / TEXT(MACRO_TO_STR(MCORE_MAIN_MODULE_NAME))); @@ -311,20 +313,16 @@ void MCore::UnloadEngine() ShutdownHostfxr(); } -#if USE_EDITOR - -void MCore::ReloadScriptingAssemblyLoadContext() +void MCore::LoadScriptingAssemblyLoadContext() { // 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(ReloadScriptingAssemblyLoadContextPtr); + static void* LoadScriptingAssemblyLoadContextPtr = GetStaticMethodPointer(TEXT("LoadScriptingAssemblyLoadContext")); + CallStaticMethod(LoadScriptingAssemblyLoadContextPtr); } -#endif - MObject* MCore::Object::Box(void* value, const MClass* klass) { static void* BoxValuePtr = GetStaticMethodPointer(TEXT("BoxValue")); diff --git a/Source/Engine/Scripting/Runtime/Mono.cpp b/Source/Engine/Scripting/Runtime/Mono.cpp index 2e507a44a..9fc8a70f2 100644 --- a/Source/Engine/Scripting/Runtime/Mono.cpp +++ b/Source/Engine/Scripting/Runtime/Mono.cpp @@ -717,7 +717,7 @@ void MCore::UnloadEngine() #if USE_EDITOR -void MCore::ReloadScriptingAssemblyLoadContext() +void MCore::LoadScriptingAssemblyLoadContext() { } diff --git a/Source/Engine/Scripting/Runtime/None.cpp b/Source/Engine/Scripting/Runtime/None.cpp index 1fb0e6d1f..8e0285cc7 100644 --- a/Source/Engine/Scripting/Runtime/None.cpp +++ b/Source/Engine/Scripting/Runtime/None.cpp @@ -60,7 +60,7 @@ void MCore::UnloadEngine() #if USE_EDITOR -void MCore::ReloadScriptingAssemblyLoadContext() +void MCore::LoadScriptingAssemblyLoadContext() { } diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 35b90a9ad..67e646807 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -39,7 +39,7 @@ class ScriptingService : public EngineService { public: ScriptingService() - : EngineService(TEXT("Scripting"), -20) + : EngineService(TEXT("Scripting"), -999) { } @@ -703,7 +703,7 @@ void Scripting::Reload(bool canTriggerSceneReload) _hasGameModulesLoaded = false; // Release and create a new assembly load context for user assemblies - MCore::ReloadScriptingAssemblyLoadContext(); + MCore::LoadScriptingAssemblyLoadContext(); // Give GC a try to cleanup old user objects and the other mess MCore::GC::Collect(); @@ -1091,9 +1091,6 @@ bool initFlaxEngine() } #endif - // TODO: move it somewhere to game instance class or similar - MainRenderTask::Instance = New(); - return false; }