private static void ValidateMarshalAPIs(bool validateUseRegistered) { string scenario = validateUseRegistered ? "use registered wrapper" : "fall back to runtime"; Console.WriteLine($"Running {nameof(ValidateMarshalAPIs)}: {scenario}..."); GlobalComWrappers registeredWrapper = GlobalComWrappers.Instance; registeredWrapper.ReturnInvalid = !validateUseRegistered; Console.WriteLine($" -- Validate Marshal.GetIUnknownForObject..."); var testObj = new Test(); IntPtr comWrapper1 = Marshal.GetIUnknownForObject(testObj); Assert.AreNotEqual(IntPtr.Zero, comWrapper1); Assert.AreEqual(testObj, registeredWrapper.LastComputeVtablesObject, "Registered ComWrappers instance should have been called"); IntPtr comWrapper2 = Marshal.GetIUnknownForObject(testObj); Assert.AreEqual(comWrapper1, comWrapper2); Marshal.Release(comWrapper1); Marshal.Release(comWrapper2); Console.WriteLine($" -- Validate Marshal.GetIDispatchForObject..."); Assert.Throws <InvalidCastException>(() => Marshal.GetIDispatchForObject(testObj)); if (validateUseRegistered) { var dispatchObj = new TestEx(IID_IDISPATCH); IntPtr dispatchWrapper = Marshal.GetIDispatchForObject(dispatchObj); Assert.AreNotEqual(IntPtr.Zero, dispatchWrapper); Assert.AreEqual(dispatchObj, registeredWrapper.LastComputeVtablesObject, "Registered ComWrappers instance should have been called"); } Console.WriteLine($" -- Validate Marshal.GetObjectForIUnknown..."); IntPtr trackerObjRaw = MockReferenceTrackerRuntime.CreateTrackerObject(); object objWrapper1 = Marshal.GetObjectForIUnknown(trackerObjRaw); Assert.AreEqual(validateUseRegistered, objWrapper1 is FakeWrapper, $"GetObjectForIUnknown should{(validateUseRegistered ? string.Empty : "not")} have returned {nameof(FakeWrapper)} instance"); object objWrapper2 = Marshal.GetObjectForIUnknown(trackerObjRaw); Assert.AreEqual(objWrapper1, objWrapper2); Console.WriteLine($" -- Validate Marshal.GetUniqueObjectForIUnknown..."); object objWrapper3 = Marshal.GetUniqueObjectForIUnknown(trackerObjRaw); Assert.AreEqual(validateUseRegistered, objWrapper3 is FakeWrapper, $"GetObjectForIUnknown should{(validateUseRegistered ? string.Empty : "not")} have returned {nameof(FakeWrapper)} instance"); Assert.AreNotEqual(objWrapper1, objWrapper3); Marshal.Release(trackerObjRaw); }
private static void ValidateRegisterForTrackerSupport() { Console.WriteLine($"Running {nameof(ValidateRegisterForTrackerSupport)}..."); var wrappers1 = GlobalComWrappers.Instance; ComWrappers.RegisterForTrackerSupport(wrappers1); Assert.Throws <InvalidOperationException>( () => { ComWrappers.RegisterForTrackerSupport(wrappers1); }, "Should not be able to re-register for global ComWrappers"); var wrappers2 = new GlobalComWrappers(); Assert.Throws <InvalidOperationException>( () => { ComWrappers.RegisterForTrackerSupport(wrappers2); }, "Should not be able to reset for global ComWrappers"); }
private static void ValidateRegisterForMarshalling() { Console.WriteLine($"Running {nameof(ValidateRegisterForMarshalling)}..."); var wrappers1 = GlobalComWrappers.Instance; ComWrappers.RegisterForMarshalling(wrappers1); Assert.Throws <InvalidOperationException>( () => { ComWrappers.RegisterForMarshalling(wrappers1); }); var wrappers2 = new GlobalComWrappers(); Assert.Throws <InvalidOperationException>( () => { ComWrappers.RegisterForMarshalling(wrappers2); }); }