From 6e0eae141b66ef61e21e3fb82b1b6e242f81c6a7 Mon Sep 17 00:00:00 2001 From: zhurengong <2731412072@qq.com> Date: Tue, 19 Apr 2022 15:45:51 +0800 Subject: [PATCH 1/3] fixed assembly can't be unloaded --- .../SharedSource/LuaCs/Cs/CsScriptLoader.cs | 9 +++++++++ .../SharedSource/LuaCs/LuaCsSetup.cs | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs index 7adf82a7a..389f19aa1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs @@ -144,5 +144,14 @@ namespace Barotrauma return files.ToArray(); } + public void Clear() + { + Assembly = null; + } + + ~CsScriptLoader() + { + + } } } \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index c25c4fa46..ec0890c7f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -278,6 +278,10 @@ namespace Barotrauma public void Stop() { + foreach (var type in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetName().Name == "NetScriptAssembly").SelectMany(assembly => assembly.GetTypes())) + { + UserData.UnregisterType(type, true); + } foreach (var mod in ACsMod.LoadedMods.ToArray()) mod.Dispose(); ACsMod.LoadedMods.Clear(); Hook?.Call("stop"); @@ -289,8 +293,18 @@ namespace Barotrauma Game = new LuaGame(); Networking = new LuaCsNetworking(); LuaScriptLoader = null; + lua = null; Lua = null; CsScript = null; + + if (CsScriptLoader != null) + { + CsScriptLoader.Clear(); + CsScriptLoader.Unload(); + CsScriptLoader = null; + GC.Collect(); + GC.WaitForPendingFinalizers(); + } } public void Initialize() From 1b0c8654590ba69aa3c58c2317cc45d56bee5949 Mon Sep 17 00:00:00 2001 From: zhurengong <2731412072@qq.com> Date: Tue, 19 Apr 2022 18:51:53 +0800 Subject: [PATCH 2/3] should get the last assembly --- .../SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs index 48393ab6b..122428209 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs @@ -13,7 +13,7 @@ namespace Barotrauma { var type = Type.GetType(typeName); if (type != null) return type; - foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) + foreach (var a in AppDomain.CurrentDomain.GetAssemblies().Reverse()) { type = a.GetType(typeName); if (type != null) From 592492a56fcb7d615c7cdfb0ef32ac733464f4ff Mon Sep 17 00:00:00 2001 From: zhurengong <2731412072@qq.com> Date: Tue, 19 Apr 2022 19:01:10 +0800 Subject: [PATCH 3/3] forgot this. --- .../SharedSource/LuaCs/Cs/CsScriptRunner.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs index 112280d50..60bdf559f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis; using System.Runtime.Loader; using System.Reflection.PortableExecutable; using System.Reflection.Metadata; +using MoonSharp.Interpreter; namespace Barotrauma { @@ -97,7 +98,11 @@ namespace Barotrauma if (runner != null) { var method = runner.GetType().GetMethod("Run", BindingFlags.Public | BindingFlags.Instance); - if (method != null) scriptResilt = method.Invoke(runner, null); + if (method != null) + { + scriptResilt = method.Invoke(runner, null); + foreach (var type in assembly.GetTypes()) { UserData.UnregisterType(type, true); } + } else LuaCsSetup.PrintCsError("Script Error - no run method detected"); } else LuaCsSetup.PrintCsError("Script Error - no runner class detected");