From 70e95414a6cad92d26a467c0a1ce6db3b8775fc0 Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Thu, 25 Jan 2024 10:19:13 -0800 Subject: [PATCH] Remove Resurrect logic as it shouldn't be needed for .NET 6 and newer. (#1380) * Remove Resurrect logic as it shouldn't be needed for .NET 6 and newer. * Remove double check. * Add check back. --- src/WinRT.Runtime/ComWrappersSupport.net5.cs | 16 +-------- src/WinRT.Runtime/IWinRTObject.net5.cs | 18 ---------- src/WinRT.Runtime/ObjectReference.cs | 38 +++----------------- 3 files changed, 6 insertions(+), 66 deletions(-) diff --git a/src/WinRT.Runtime/ComWrappersSupport.net5.cs b/src/WinRT.Runtime/ComWrappersSupport.net5.cs index a178e72cd..697955fe1 100644 --- a/src/WinRT.Runtime/ComWrappersSupport.net5.cs +++ b/src/WinRT.Runtime/ComWrappersSupport.net5.cs @@ -115,12 +115,6 @@ internal static unsafe InspectableInfo GetInspectableInfo(IntPtr pThis) // We need to do the same thing for System.Type because there can be multiple WUX.Interop.TypeName's // for a single System.Type. - // Resurrect IWinRTObject's disposed IObjectReferences, if necessary - if (rcw is IWinRTObject winrtObj) - { - winrtObj.Resurrect(); - } - return rcw switch { ABI.System.Nullable nt => (T)nt.Value, @@ -160,15 +154,7 @@ public static void RegisterObjectForInterface(object obj, IntPtr thisPtr) => public static object TryRegisterObjectForInterface(object obj, IntPtr thisPtr) { - var rcw = ComWrappers.GetOrRegisterObjectForComInstance(thisPtr, CreateObjectFlags.TrackerObject, obj); - - // Resurrect IWinRTObject's disposed IObjectReferences, if necessary - var target = rcw is Delegate del ? del.Target : rcw; - if (target is IWinRTObject winrtObj) - { - winrtObj.Resurrect(); - } - return rcw; + return ComWrappers.GetOrRegisterObjectForComInstance(thisPtr, CreateObjectFlags.TrackerObject, obj); } public static IObjectReference CreateCCWForObject(object obj) diff --git a/src/WinRT.Runtime/IWinRTObject.net5.cs b/src/WinRT.Runtime/IWinRTObject.net5.cs index edc26e8ef..cde5326ee 100644 --- a/src/WinRT.Runtime/IWinRTObject.net5.cs +++ b/src/WinRT.Runtime/IWinRTObject.net5.cs @@ -184,23 +184,5 @@ object GetOrCreateTypeHelperData(RuntimeTypeHandle type, Func helperData { return AdditionalTypeData.GetOrAdd(type, (type) => helperDataFactory()); } - - internal void Resurrect() - { - if (NativeObject.Resurrect()) - { - foreach (var cached in QueryInterfaceCache) - { - cached.Value.Resurrect(); - } - - // Delegates store their agile reference as an additional type data. - // These should be recreated when instances are resurrect. - if (AdditionalTypeData.TryGetValue(typeof(AgileReference).TypeHandle, out var agileObj)) - { - AdditionalTypeData.TryUpdate(typeof(AgileReference).TypeHandle, new AgileReference(NativeObject), agileObj); - } - } - } } } \ No newline at end of file diff --git a/src/WinRT.Runtime/ObjectReference.cs b/src/WinRT.Runtime/ObjectReference.cs index 08606d430..1a63960b4 100644 --- a/src/WinRT.Runtime/ObjectReference.cs +++ b/src/WinRT.Runtime/ObjectReference.cs @@ -247,12 +247,12 @@ public IntPtr GetRef() protected void ThrowIfDisposed() { - if (disposed) + if (disposed) { - lock (_disposedLock) - { - if (disposed) throw new ObjectDisposedException("ObjectReference"); - } + lock (_disposedLock) + { + if (disposed) throw new ObjectDisposedException("ObjectReference"); + } } } @@ -287,22 +287,6 @@ protected virtual void Dispose(bool disposing) } } - internal bool Resurrect() - { - lock (_disposedLock) - { - if (!disposed) - { - return false; - } - disposed = false; - ResurrectTrackerSource(); - AddRef(); - GC.ReRegisterForFinalize(this); - return true; - } - } - protected virtual unsafe void AddRef(bool refFromTrackerSource) { VftblIUnknown.AddRef(ThisPtr); @@ -353,18 +337,6 @@ internal unsafe void ReleaseFromTrackerSource() } } - private unsafe void ResurrectTrackerSource() - { - if (ReferenceTrackerPtr != IntPtr.Zero) - { - ReferenceTracker.IUnknownVftbl.AddRef(ReferenceTrackerPtr); - if (!PreventReleaseFromTrackerSourceOnDispose) - { - ReferenceTracker.AddRefFromTrackerSource(ReferenceTrackerPtr); - } - } - } - private unsafe void DisposeTrackerSource() { if (ReferenceTrackerPtr != IntPtr.Zero)