Пример #1
0
        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);
        }
Пример #2
0
        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");
        }
Пример #3
0
        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);
            });
        }