diff --git a/managed/CounterStrikeSharp.API/Core/BasePlugin.cs b/managed/CounterStrikeSharp.API/Core/BasePlugin.cs index c90193071..41a0bb814 100644 --- a/managed/CounterStrikeSharp.API/Core/BasePlugin.cs +++ b/managed/CounterStrikeSharp.API/Core/BasePlugin.cs @@ -665,32 +665,32 @@ protected virtual void Dispose(bool disposing) if (_disposed) return; if (!disposing) return; - foreach (var subscriber in Handlers.Values) + foreach (var subscriber in Handlers.Values.ToList()) { subscriber.Dispose(); } - foreach (var subscriber in CommandListeners.Values) + foreach (var subscriber in CommandListeners.Values.ToList()) { subscriber.Dispose(); } - foreach (var subscriber in Listeners.Values) + foreach (var subscriber in Listeners.Values.ToList()) { subscriber.Dispose(); } - foreach (var subscriber in EntityOutputHooks.Values) + foreach (var subscriber in EntityOutputHooks.Values.ToList()) { subscriber.Dispose(); } - foreach (var definition in CommandDefinitions) + foreach (var definition in CommandDefinitions.ToList()) { CommandManager.RemoveCommand(definition); } - foreach (var timer in Timers) + foreach (var timer in Timers.ToList()) { timer.Kill(); } diff --git a/managed/CounterStrikeSharp.API/Core/FunctionReference.cs b/managed/CounterStrikeSharp.API/Core/FunctionReference.cs index 02bd8dd58..74794608a 100644 --- a/managed/CounterStrikeSharp.API/Core/FunctionReference.cs +++ b/managed/CounterStrikeSharp.API/Core/FunctionReference.cs @@ -49,6 +49,7 @@ public class FunctionReference private readonly Delegate _targetMethod; private readonly CallbackDelegate _nativeCallback; + private readonly GCHandle _nativeCallbackHandle; private readonly TaskCompletionSource _taskCompletionSource = new(); @@ -57,6 +58,7 @@ private FunctionReference(Delegate method, FunctionLifetime lifetime) Lifetime = lifetime; _targetMethod = method; _nativeCallback = CreateWrappedCallback(); + _nativeCallbackHandle = GCHandle.Alloc(_nativeCallback); } /// @@ -178,6 +180,11 @@ public static void Remove(int reference) IdToFunctionReferencesMap.Remove(reference, out _); + if (functionReference._nativeCallbackHandle.IsAllocated) + { + functionReference._nativeCallbackHandle.Free(); + } + Application.Instance.Logger.LogDebug("Removing function/callback reference: {Reference}", reference); } }