diff --git a/src/tests/Interop/COM/ComWrappers/WeakReference/WeakReferenceTest.cs b/src/tests/Interop/COM/ComWrappers/WeakReference/WeakReferenceTest.cs index cc4c8c2d8b8c2..4add58e9aaf38 100644 --- a/src/tests/Interop/COM/ComWrappers/WeakReference/WeakReferenceTest.cs +++ b/src/tests/Interop/COM/ComWrappers/WeakReference/WeakReferenceTest.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Runtime.CompilerServices; + namespace ComWrappersTests { using System; @@ -132,28 +134,30 @@ private static void ValidateWeakReferenceState(WeakReference, IntPtr) GetWeakReference(TestComWrappers cw) + private static void ValidateNativeWeakReference(TestComWrappers cw) { - IntPtr objRaw = WeakReferenceNative.CreateWeakReferencableObject(); - var obj = (WeakReferenceableWrapper)cw.GetOrCreateObjectForComInstance(objRaw, CreateObjectFlags.None); - var wr = new WeakReference(obj); - ValidateWeakReferenceState(wr, expectedIsAlive: true, cw); - GC.KeepAlive(obj); - return (wr, objRaw); - } + [MethodImpl(MethodImplOptions.NoInlining)] + static (WeakReference, IntPtr) GetWeakReference(TestComWrappers cw) + { + IntPtr objRaw = WeakReferenceNative.CreateWeakReferencableObject(); + var obj = (WeakReferenceableWrapper)cw.GetOrCreateObjectForComInstance(objRaw, CreateObjectFlags.None); + var wr = new WeakReference(obj); + ValidateWeakReferenceState(wr, expectedIsAlive: true, cw); + GC.KeepAlive(obj); + return (wr, objRaw); + } - private static IntPtr SetWeakReferenceTarget(WeakReference wr, TestComWrappers cw) - { - IntPtr objRaw = WeakReferenceNative.CreateWeakReferencableObject(); - var obj = (WeakReferenceableWrapper)cw.GetOrCreateObjectForComInstance(objRaw, CreateObjectFlags.None); - wr.SetTarget(obj); - ValidateWeakReferenceState(wr, expectedIsAlive: true, cw); - GC.KeepAlive(obj); - return objRaw; - } + [MethodImpl(MethodImplOptions.NoInlining)] + static IntPtr SetWeakReferenceTarget(WeakReference wr, TestComWrappers cw) + { + IntPtr objRaw = WeakReferenceNative.CreateWeakReferencableObject(); + var obj = (WeakReferenceableWrapper)cw.GetOrCreateObjectForComInstance(objRaw, CreateObjectFlags.None); + wr.SetTarget(obj); + ValidateWeakReferenceState(wr, expectedIsAlive: true, cw); + GC.KeepAlive(obj); + return objRaw; + } - private static void ValidateNativeWeakReference(TestComWrappers cw) - { Console.WriteLine($" -- Validate weak reference creation"); var (weakRef, nativeRef) = GetWeakReference(cw); @@ -220,20 +224,20 @@ static void ValidateLocalInstance() static void ValidateNonComWrappers() { - Console.WriteLine($"Running {nameof(ValidateNonComWrappers)}..."); - - (WeakReference, IntPtr) GetWeakReference() + [MethodImpl(MethodImplOptions.NoInlining)] + static (WeakReference, IntPtr) GetWeakReference() { IntPtr objRaw = WeakReferenceNative.CreateWeakReferencableObject(); var obj = Marshal.GetObjectForIUnknown(objRaw); return (new WeakReference(obj), objRaw); } - bool HasTarget(WeakReference wr) + static bool HasTarget(WeakReference wr) { return wr.Target != null; } + Console.WriteLine($"Running {nameof(ValidateNonComWrappers)}..."); var (weakRef, nativeRef) = GetWeakReference(); GC.Collect(); GC.WaitForPendingFinalizers(); @@ -254,6 +258,15 @@ bool HasTarget(WeakReference wr) static void ValidateAggregatedWeakReference() { + [MethodImpl(MethodImplOptions.NoInlining)] + static (GCHandle handle, WeakReference) GetWeakReference() + { + DerivedObject obj = new DerivedObject(TestComWrappers.TrackerSupportInstance); + // We use an explicit weak GC handle here to enable us to validate that we are using "weak" GCHandle + // semantics with the weak reference. + return (GCHandle.Alloc(obj, GCHandleType.Weak), new WeakReference(obj)); + } + Console.WriteLine("Validate weak reference with aggregation."); var (handle, weakRef) = GetWeakReference(); @@ -262,14 +275,6 @@ static void ValidateAggregatedWeakReference() Assert.Null(handle.Target); Assert.False(weakRef.TryGetTarget(out _)); - - static (GCHandle handle, WeakReference) GetWeakReference() - { - DerivedObject obj = new DerivedObject(TestComWrappers.TrackerSupportInstance); - // We use an explicit weak GC handle here to enable us to validate that we are using "weak" GCHandle - // semantics with the weak reference. - return (GCHandle.Alloc(obj, GCHandleType.Weak), new WeakReference(obj)); - } } static int Main()