diff --git a/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs b/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs
index de7629276..372928725 100644
--- a/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs
+++ b/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs
@@ -15,7 +15,7 @@ namespace Dalamud.Interface.Internal.ReShadeHandling;
/// ReShade interface.
internal sealed unsafe partial class ReShadeAddonInterface : IDisposable
{
- private const int ReShadeApiVersion = 12;
+ private const int ReShadeApiVersion = 1;
private readonly HMODULE hDalamudModule;
@@ -25,6 +25,8 @@ internal sealed unsafe partial class ReShadeAddonInterface : IDisposable
private readonly DelegateStorage initSwapChainDelegate;
private readonly DelegateStorage destroySwapChainDelegate;
+ private bool requiresFinalize;
+
private ReShadeAddonInterface()
{
this.hDalamudModule = (HMODULE)Marshal.GetHINSTANCE(typeof(ReShadeAddonInterface).Assembly.ManifestModule);
@@ -40,16 +42,37 @@ internal sealed unsafe partial class ReShadeAddonInterface : IDisposable
0,
this.GetModuleHandleExWDetour);
- this.addonModuleResolverHook.Enable();
- Exports.ReShadeRegisterEvent(
- AddonEvent.ReShadeOverlay,
- this.reShadeOverlayDelegate = new((ref ApiObject rt) => this.ReShadeOverlay?.Invoke(ref rt)));
- Exports.ReShadeRegisterEvent(
- AddonEvent.InitSwapChain,
- this.initSwapChainDelegate = new((ref ApiObject rt) => this.InitSwapChain?.Invoke(ref rt)));
- Exports.ReShadeRegisterEvent(
- AddonEvent.DestroySwapChain,
- this.destroySwapChainDelegate = new((ref ApiObject rt) => this.DestroySwapChain?.Invoke(ref rt)));
+ try
+ {
+ this.addonModuleResolverHook.Enable();
+ Exports.ReShadeRegisterEvent(
+ AddonEvent.ReShadeOverlay,
+ this.reShadeOverlayDelegate = new((ref ApiObject rt) => this.ReShadeOverlay?.Invoke(ref rt)));
+ Exports.ReShadeRegisterEvent(
+ AddonEvent.InitSwapChain,
+ this.initSwapChainDelegate = new((ref ApiObject rt) => this.InitSwapChain?.Invoke(ref rt)));
+ Exports.ReShadeRegisterEvent(
+ AddonEvent.DestroySwapChain,
+ this.destroySwapChainDelegate = new((ref ApiObject rt) => this.DestroySwapChain?.Invoke(ref rt)));
+ }
+ catch (Exception e1)
+ {
+ Exports.ReShadeUnregisterAddon(this.hDalamudModule);
+
+ try
+ {
+ this.addonModuleResolverHook.Disable();
+ this.addonModuleResolverHook.Dispose();
+ }
+ catch (Exception e2)
+ {
+ throw new AggregateException(e1, e2);
+ }
+
+ throw;
+ }
+
+ this.requiresFinalize = true;
}
/// Finalizes an instance of the class.
@@ -104,9 +127,10 @@ internal sealed unsafe partial class ReShadeAddonInterface : IDisposable
private void ReleaseUnmanagedResources()
{
- Exports.ReShadeUnregisterEvent(AddonEvent.InitSwapChain, this.initSwapChainDelegate);
- Exports.ReShadeUnregisterEvent(AddonEvent.DestroySwapChain, this.destroySwapChainDelegate);
- Exports.ReShadeUnregisterEvent(AddonEvent.ReShadeOverlay, this.reShadeOverlayDelegate);
+ if (!this.requiresFinalize)
+ return;
+ this.requiresFinalize = false;
+ // This will also unregister addon event registrations.
Exports.ReShadeUnregisterAddon(this.hDalamudModule);
this.addonModuleResolverHook.Disable();
this.addonModuleResolverHook.Dispose();