diff --git a/Dalamud.CorePlugin/PluginImpl.cs b/Dalamud.CorePlugin/PluginImpl.cs
index cb9b4368a..7c9adc6a8 100644
--- a/Dalamud.CorePlugin/PluginImpl.cs
+++ b/Dalamud.CorePlugin/PluginImpl.cs
@@ -97,8 +97,6 @@ namespace Dalamud.CorePlugin
this.Interface.UiBuilder.Draw -= this.OnDraw;
this.windowSystem.RemoveAllWindows();
-
- this.Interface.ExplicitDispose();
}
///
diff --git a/Dalamud/Configuration/Internal/DalamudConfiguration.cs b/Dalamud/Configuration/Internal/DalamudConfiguration.cs
index 85a9507c9..70ed5dfde 100644
--- a/Dalamud/Configuration/Internal/DalamudConfiguration.cs
+++ b/Dalamud/Configuration/Internal/DalamudConfiguration.cs
@@ -26,7 +26,7 @@ namespace Dalamud.Configuration.Internal;
#pragma warning disable SA1015
[InherentDependency] // We must still have this when unloading
#pragma warning restore SA1015
-internal sealed class DalamudConfiguration : IServiceType, IDisposable
+internal sealed class DalamudConfiguration : IInternalDisposableService
{
private static readonly JsonSerializerSettings SerializerSettings = new()
{
@@ -502,7 +502,7 @@ internal sealed class DalamudConfiguration : IServiceType, IDisposable
}
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
// Make sure that we save, if a save is queued while we are shutting down
this.Update();
diff --git a/Dalamud/Dalamud.cs b/Dalamud/Dalamud.cs
index 8c858ce7c..f9d2aff3c 100644
--- a/Dalamud/Dalamud.cs
+++ b/Dalamud/Dalamud.cs
@@ -9,7 +9,6 @@ using System.Threading.Tasks;
using Dalamud.Common;
using Dalamud.Configuration.Internal;
using Dalamud.Game;
-using Dalamud.Interface.Internal;
using Dalamud.Plugin.Internal;
using Dalamud.Storage;
using Dalamud.Utility;
@@ -187,27 +186,6 @@ internal sealed class Dalamud : IServiceType
this.unloadSignal.WaitOne();
}
- ///
- /// Dispose subsystems related to plugin handling.
- ///
- public void DisposePlugins()
- {
- // this must be done before unloading interface manager, in order to do rebuild
- // the correct cascaded WndProc (IME -> RawDX11Scene -> Game). Otherwise the game
- // will not receive any windows messages
- Service.GetNullable()?.Dispose();
-
- // this must be done before unloading plugins, or it can cause a race condition
- // due to rendering happening on another thread, where a plugin might receive
- // a render call after it has been disposed, which can crash if it attempts to
- // use any resources that it freed in its own Dispose method
- Service.GetNullable()?.Dispose();
-
- Service.GetNullable()?.Dispose();
-
- Service.GetNullable()?.Dispose();
- }
-
///
/// Replace the current exception handler with the default one.
///
diff --git a/Dalamud/Data/DataManager.cs b/Dalamud/Data/DataManager.cs
index b08c6ffe7..da93f57c4 100644
--- a/Dalamud/Data/DataManager.cs
+++ b/Dalamud/Data/DataManager.cs
@@ -27,7 +27,7 @@ namespace Dalamud.Data;
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal sealed class DataManager : IDisposable, IServiceType, IDataManager
+internal sealed class DataManager : IInternalDisposableService, IDataManager
{
private readonly Thread luminaResourceThread;
private readonly CancellationTokenSource luminaCancellationTokenSource;
@@ -158,7 +158,7 @@ internal sealed class DataManager : IDisposable, IServiceType, IDataManager
#endregion
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.luminaCancellationTokenSource.Cancel();
}
diff --git a/Dalamud/EntryPoint.cs b/Dalamud/EntryPoint.cs
index d0f9e8845..1ad3ad8a9 100644
--- a/Dalamud/EntryPoint.cs
+++ b/Dalamud/EntryPoint.cs
@@ -138,7 +138,9 @@ public sealed class EntryPoint
SerilogEventSink.Instance.LogLine += SerilogOnLogLine;
// Load configuration first to get some early persistent state, like log level
+#pragma warning disable CS0618 // Type or member is obsolete
var fs = new ReliableFileStorage(Path.GetDirectoryName(info.ConfigurationPath)!);
+#pragma warning restore CS0618 // Type or member is obsolete
var configuration = DalamudConfiguration.Load(info.ConfigurationPath!, fs);
// Set the appropriate logging level from the configuration
diff --git a/Dalamud/Game/Addon/Events/AddonEventManager.cs b/Dalamud/Game/Addon/Events/AddonEventManager.cs
index 8ee09bed8..a9b9ef5fa 100644
--- a/Dalamud/Game/Addon/Events/AddonEventManager.cs
+++ b/Dalamud/Game/Addon/Events/AddonEventManager.cs
@@ -19,7 +19,7 @@ namespace Dalamud.Game.Addon.Events;
///
[InterfaceVersion("1.0")]
[ServiceManager.EarlyLoadedService]
-internal unsafe class AddonEventManager : IDisposable, IServiceType
+internal unsafe class AddonEventManager : IInternalDisposableService
{
///
/// PluginName for Dalamud Internal use.
@@ -62,7 +62,7 @@ internal unsafe class AddonEventManager : IDisposable, IServiceType
private delegate nint UpdateCursorDelegate(RaptureAtkModule* module);
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.onUpdateCursor.Dispose();
@@ -204,7 +204,7 @@ internal unsafe class AddonEventManager : IDisposable, IServiceType
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class AddonEventManagerPluginScoped : IDisposable, IServiceType, IAddonEventManager
+internal class AddonEventManagerPluginScoped : IInternalDisposableService, IAddonEventManager
{
[ServiceManager.ServiceDependency]
private readonly AddonEventManager eventManagerService = Service.Get();
@@ -225,7 +225,7 @@ internal class AddonEventManagerPluginScoped : IDisposable, IServiceType, IAddon
}
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
// if multiple plugins force cursors and dispose without un-forcing them then all forces will be cleared.
if (this.isForcingCursor)
diff --git a/Dalamud/Game/Addon/Lifecycle/AddonLifecycle.cs b/Dalamud/Game/Addon/Lifecycle/AddonLifecycle.cs
index 37f12ce3a..eefb3b5e9 100644
--- a/Dalamud/Game/Addon/Lifecycle/AddonLifecycle.cs
+++ b/Dalamud/Game/Addon/Lifecycle/AddonLifecycle.cs
@@ -19,7 +19,7 @@ namespace Dalamud.Game.Addon.Lifecycle;
///
[InterfaceVersion("1.0")]
[ServiceManager.EarlyLoadedService]
-internal unsafe class AddonLifecycle : IDisposable, IServiceType
+internal unsafe class AddonLifecycle : IInternalDisposableService
{
private static readonly ModuleLog Log = new("AddonLifecycle");
@@ -89,7 +89,7 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType
internal List EventListeners { get; } = new();
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.onAddonSetupHook.Dispose();
this.onAddonSetup2Hook.Dispose();
@@ -383,7 +383,7 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class AddonLifecyclePluginScoped : IDisposable, IServiceType, IAddonLifecycle
+internal class AddonLifecyclePluginScoped : IInternalDisposableService, IAddonLifecycle
{
[ServiceManager.ServiceDependency]
private readonly AddonLifecycle addonLifecycleService = Service.Get();
@@ -391,7 +391,7 @@ internal class AddonLifecyclePluginScoped : IDisposable, IServiceType, IAddonLif
private readonly List eventListeners = new();
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
foreach (var listener in this.eventListeners)
{
diff --git a/Dalamud/Game/ChatHandlers.cs b/Dalamud/Game/ChatHandlers.cs
index 836fb5ec8..5dd6ed3ba 100644
--- a/Dalamud/Game/ChatHandlers.cs
+++ b/Dalamud/Game/ChatHandlers.cs
@@ -11,6 +11,7 @@ using Dalamud.Game.Gui;
using Dalamud.Game.Text;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
+using Dalamud.Interface.ImGuiNotification.Internal;
using Dalamud.Interface.Internal;
using Dalamud.Interface.Internal.Notifications;
using Dalamud.Interface.Internal.Windows;
diff --git a/Dalamud/Game/ClientState/ClientState.cs b/Dalamud/Game/ClientState/ClientState.cs
index d387c2e2d..bd4259f5a 100644
--- a/Dalamud/Game/ClientState/ClientState.cs
+++ b/Dalamud/Game/ClientState/ClientState.cs
@@ -23,7 +23,7 @@ namespace Dalamud.Game.ClientState;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal sealed class ClientState : IDisposable, IServiceType, IClientState
+internal sealed class ClientState : IInternalDisposableService, IClientState
{
private static readonly ModuleLog Log = new("ClientState");
@@ -115,7 +115,7 @@ internal sealed class ClientState : IDisposable, IServiceType, IClientState
///
/// Dispose of managed and unmanaged resources.
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.setupTerritoryTypeHook.Dispose();
this.framework.Update -= this.FrameworkOnOnUpdateEvent;
@@ -196,7 +196,7 @@ internal sealed class ClientState : IDisposable, IServiceType, IClientState
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class ClientStatePluginScoped : IDisposable, IServiceType, IClientState
+internal class ClientStatePluginScoped : IInternalDisposableService, IClientState
{
[ServiceManager.ServiceDependency]
private readonly ClientState clientStateService = Service.Get();
@@ -257,7 +257,7 @@ internal class ClientStatePluginScoped : IDisposable, IServiceType, IClientState
public bool IsGPosing => this.clientStateService.IsGPosing;
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.clientStateService.TerritoryChanged -= this.TerritoryChangedForward;
this.clientStateService.Login -= this.LoginForward;
diff --git a/Dalamud/Game/ClientState/Conditions/Condition.cs b/Dalamud/Game/ClientState/Conditions/Condition.cs
index a298b1502..dc8b28494 100644
--- a/Dalamud/Game/ClientState/Conditions/Condition.cs
+++ b/Dalamud/Game/ClientState/Conditions/Condition.cs
@@ -10,7 +10,7 @@ namespace Dalamud.Game.ClientState.Conditions;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal sealed partial class Condition : IServiceType, ICondition
+internal sealed partial class Condition : IInternalDisposableService, ICondition
{
///
/// Gets the current max number of conditions. You can get this just by looking at the condition sheet and how many rows it has.
@@ -22,6 +22,8 @@ internal sealed partial class Condition : IServiceType, ICondition
private readonly bool[] cache = new bool[MaxConditionEntries];
+ private bool isDisposed;
+
[ServiceManager.ServiceConstructor]
private Condition(ClientState clientState)
{
@@ -35,6 +37,9 @@ internal sealed partial class Condition : IServiceType, ICondition
this.framework.Update += this.FrameworkUpdate;
}
+ /// Finalizes an instance of the class.
+ ~Condition() => this.Dispose(false);
+
///
public event ICondition.ConditionChangeDelegate? ConditionChange;
@@ -60,6 +65,9 @@ internal sealed partial class Condition : IServiceType, ICondition
public bool this[ConditionFlag flag]
=> this[(int)flag];
+ ///
+ void IInternalDisposableService.DisposeService() => this.Dispose(true);
+
///
public bool Any()
{
@@ -89,6 +97,19 @@ internal sealed partial class Condition : IServiceType, ICondition
return false;
}
+ private void Dispose(bool disposing)
+ {
+ if (this.isDisposed)
+ return;
+
+ if (disposing)
+ {
+ this.framework.Update -= this.FrameworkUpdate;
+ }
+
+ this.isDisposed = true;
+ }
+
private void FrameworkUpdate(IFramework unused)
{
for (var i = 0; i < MaxConditionEntries; i++)
@@ -112,44 +133,6 @@ internal sealed partial class Condition : IServiceType, ICondition
}
}
-///
-/// Provides access to conditions (generally player state). You can check whether a player is in combat, mounted, etc.
-///
-internal sealed partial class Condition : IDisposable
-{
- private bool isDisposed;
-
- ///
- /// Finalizes an instance of the class.
- ///
- ~Condition()
- {
- this.Dispose(false);
- }
-
- ///
- /// Disposes this instance, alongside its hooks.
- ///
- void IDisposable.Dispose()
- {
- GC.SuppressFinalize(this);
- this.Dispose(true);
- }
-
- private void Dispose(bool disposing)
- {
- if (this.isDisposed)
- return;
-
- if (disposing)
- {
- this.framework.Update -= this.FrameworkUpdate;
- }
-
- this.isDisposed = true;
- }
-}
-
///
/// Plugin-scoped version of a Condition service.
///
@@ -159,7 +142,7 @@ internal sealed partial class Condition : IDisposable
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class ConditionPluginScoped : IDisposable, IServiceType, ICondition
+internal class ConditionPluginScoped : IInternalDisposableService, ICondition
{
[ServiceManager.ServiceDependency]
private readonly Condition conditionService = Service.Get();
@@ -185,7 +168,7 @@ internal class ConditionPluginScoped : IDisposable, IServiceType, ICondition
public bool this[int flag] => this.conditionService[flag];
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.conditionService.ConditionChange -= this.ConditionChangedForward;
diff --git a/Dalamud/Game/ClientState/GamePad/GamepadState.cs b/Dalamud/Game/ClientState/GamePad/GamepadState.cs
index 40e632113..a0e16f0e2 100644
--- a/Dalamud/Game/ClientState/GamePad/GamepadState.cs
+++ b/Dalamud/Game/ClientState/GamePad/GamepadState.cs
@@ -21,7 +21,7 @@ namespace Dalamud.Game.ClientState.GamePad;
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal unsafe class GamepadState : IDisposable, IServiceType, IGamepadState
+internal unsafe class GamepadState : IInternalDisposableService, IGamepadState
{
private readonly Hook? gamepadPoll;
@@ -109,7 +109,7 @@ internal unsafe class GamepadState : IDisposable, IServiceType, IGamepadState
///
/// Disposes this instance, alongside its hooks.
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.Dispose(true);
GC.SuppressFinalize(this);
diff --git a/Dalamud/Game/Command/CommandManager.cs b/Dalamud/Game/Command/CommandManager.cs
index 6b67f1892..7dcca763b 100644
--- a/Dalamud/Game/Command/CommandManager.cs
+++ b/Dalamud/Game/Command/CommandManager.cs
@@ -19,7 +19,7 @@ namespace Dalamud.Game.Command;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal sealed class CommandManager : IServiceType, IDisposable, ICommandManager
+internal sealed class CommandManager : IInternalDisposableService, ICommandManager
{
private static readonly ModuleLog Log = new("Command");
@@ -130,7 +130,7 @@ internal sealed class CommandManager : IServiceType, IDisposable, ICommandManage
}
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.chatGui.CheckMessageHandled -= this.OnCheckMessageHandled;
}
@@ -170,7 +170,7 @@ internal sealed class CommandManager : IServiceType, IDisposable, ICommandManage
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class CommandManagerPluginScoped : IDisposable, IServiceType, ICommandManager
+internal class CommandManagerPluginScoped : IInternalDisposableService, ICommandManager
{
private static readonly ModuleLog Log = new("Command");
@@ -193,7 +193,7 @@ internal class CommandManagerPluginScoped : IDisposable, IServiceType, ICommandM
public ReadOnlyDictionary Commands => this.commandManagerService.Commands;
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
foreach (var command in this.pluginRegisteredCommands)
{
diff --git a/Dalamud/Game/Config/GameConfig.cs b/Dalamud/Game/Config/GameConfig.cs
index 162df9417..a021025b1 100644
--- a/Dalamud/Game/Config/GameConfig.cs
+++ b/Dalamud/Game/Config/GameConfig.cs
@@ -15,7 +15,7 @@ namespace Dalamud.Game.Config;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal sealed class GameConfig : IServiceType, IGameConfig, IDisposable
+internal sealed class GameConfig : IInternalDisposableService, IGameConfig
{
private readonly TaskCompletionSource tcsInitialization = new();
private readonly TaskCompletionSource tcsSystem = new();
@@ -195,7 +195,7 @@ internal sealed class GameConfig : IServiceType, IGameConfig, IDisposable
public void Set(UiControlOption option, string value) => this.UiControl.Set(option.GetName(), value);
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
var ode = new ObjectDisposedException(nameof(GameConfig));
this.tcsInitialization.SetExceptionIfIncomplete(ode);
@@ -248,7 +248,7 @@ internal sealed class GameConfig : IServiceType, IGameConfig, IDisposable
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class GameConfigPluginScoped : IDisposable, IServiceType, IGameConfig
+internal class GameConfigPluginScoped : IInternalDisposableService, IGameConfig
{
[ServiceManager.ServiceDependency]
private readonly GameConfig gameConfigService = Service.Get();
@@ -295,7 +295,7 @@ internal class GameConfigPluginScoped : IDisposable, IServiceType, IGameConfig
public GameConfigSection UiControl => this.gameConfigService.UiControl;
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.gameConfigService.Changed -= this.ConfigChangedForward;
this.initializationTask.ContinueWith(
diff --git a/Dalamud/Game/DutyState/DutyState.cs b/Dalamud/Game/DutyState/DutyState.cs
index c4bda0d19..e2e4aef15 100644
--- a/Dalamud/Game/DutyState/DutyState.cs
+++ b/Dalamud/Game/DutyState/DutyState.cs
@@ -13,7 +13,7 @@ namespace Dalamud.Game.DutyState;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal unsafe class DutyState : IDisposable, IServiceType, IDutyState
+internal unsafe class DutyState : IInternalDisposableService, IDutyState
{
private readonly DutyStateAddressResolver address;
private readonly Hook contentDirectorNetworkMessageHook;
@@ -62,7 +62,7 @@ internal unsafe class DutyState : IDisposable, IServiceType, IDutyState
private bool CompletedThisTerritory { get; set; }
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.contentDirectorNetworkMessageHook.Dispose();
this.framework.Update -= this.FrameworkOnUpdateEvent;
@@ -168,7 +168,7 @@ internal unsafe class DutyState : IDisposable, IServiceType, IDutyState
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class DutyStatePluginScoped : IDisposable, IServiceType, IDutyState
+internal class DutyStatePluginScoped : IInternalDisposableService, IDutyState
{
[ServiceManager.ServiceDependency]
private readonly DutyState dutyStateService = Service.Get();
@@ -200,7 +200,7 @@ internal class DutyStatePluginScoped : IDisposable, IServiceType, IDutyState
public bool IsDutyStarted => this.dutyStateService.IsDutyStarted;
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.dutyStateService.DutyStarted -= this.DutyStartedForward;
this.dutyStateService.DutyWiped -= this.DutyWipedForward;
diff --git a/Dalamud/Game/Framework.cs b/Dalamud/Game/Framework.cs
index 606bf03da..91b38348a 100644
--- a/Dalamud/Game/Framework.cs
+++ b/Dalamud/Game/Framework.cs
@@ -23,7 +23,7 @@ namespace Dalamud.Game;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal sealed class Framework : IDisposable, IServiceType, IFramework
+internal sealed class Framework : IInternalDisposableService, IFramework
{
private static readonly ModuleLog Log = new("Framework");
@@ -279,7 +279,7 @@ internal sealed class Framework : IDisposable, IServiceType, IFramework
///
/// Dispose of managed and unmanaged resources.
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.RunOnFrameworkThread(() =>
{
@@ -476,7 +476,7 @@ internal sealed class Framework : IDisposable, IServiceType, IFramework
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class FrameworkPluginScoped : IDisposable, IServiceType, IFramework
+internal class FrameworkPluginScoped : IInternalDisposableService, IFramework
{
[ServiceManager.ServiceDependency]
private readonly Framework frameworkService = Service.Get();
@@ -511,7 +511,7 @@ internal class FrameworkPluginScoped : IDisposable, IServiceType, IFramework
public bool IsFrameworkUnloading => this.frameworkService.IsFrameworkUnloading;
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.frameworkService.Update -= this.OnUpdateForward;
diff --git a/Dalamud/Game/Gui/ChatGui.cs b/Dalamud/Game/Gui/ChatGui.cs
index 02b52ee56..e0b90b382 100644
--- a/Dalamud/Game/Gui/ChatGui.cs
+++ b/Dalamud/Game/Gui/ChatGui.cs
@@ -29,7 +29,7 @@ namespace Dalamud.Game.Gui;
///
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui
+internal sealed unsafe class ChatGui : IInternalDisposableService, IChatGui
{
private static readonly ModuleLog Log = new("ChatGui");
@@ -109,7 +109,7 @@ internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui
///
/// Dispose of managed and unmanaged resources.
///
- void IDisposable.Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.printMessageHook.Dispose();
this.populateItemLinkHook.Dispose();
@@ -409,7 +409,7 @@ internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui
#pragma warning disable SA1015
[ResolveVia]
#pragma warning restore SA1015
-internal class ChatGuiPluginScoped : IDisposable, IServiceType, IChatGui
+internal class ChatGuiPluginScoped : IInternalDisposableService, IChatGui
{
[ServiceManager.ServiceDependency]
private readonly ChatGui chatGuiService = Service.Get();
@@ -447,7 +447,7 @@ internal class ChatGuiPluginScoped : IDisposable, IServiceType, IChatGui
public IReadOnlyDictionary<(string PluginName, uint CommandId), Action> RegisteredLinkHandlers => this.chatGuiService.RegisteredLinkHandlers;
///
- public void Dispose()
+ void IInternalDisposableService.DisposeService()
{
this.chatGuiService.ChatMessage -= this.OnMessageForward;
this.chatGuiService.CheckMessageHandled -= this.OnCheckMessageForward;
diff --git a/Dalamud/Game/Gui/ContextMenu/ContextMenu.cs b/Dalamud/Game/Gui/ContextMenu/ContextMenu.cs
index 65c9b2760..f136d017a 100644
--- a/Dalamud/Game/Gui/ContextMenu/ContextMenu.cs
+++ b/Dalamud/Game/Gui/ContextMenu/ContextMenu.cs
@@ -28,7 +28,7 @@ namespace Dalamud.Game.Gui.ContextMenu;
///
[InterfaceVersion("1.0")]
[ServiceManager.EarlyLoadedService]
-internal sealed unsafe class ContextMenu : IDisposable, IServiceType, IContextMenu
+internal sealed unsafe class ContextMenu : IInternalDisposableService, IContextMenu
{
private static readonly ModuleLog Log = new("ContextMenu");
@@ -77,7 +77,7 @@ internal sealed unsafe class ContextMenu : IDisposable, IServiceType, IContextMe
private IReadOnlyList