コード例 #1
0
ファイル: Program.cs プロジェクト: z77ma/runtime
            static WeakReference <ITrackerObjectWrapper> CreateAndRegisterWrapper(ComWrappers cw, IntPtr trackerObjRaw)
            {
                // Manually create a wrapper
                var    iid = typeof(ITrackerObject).GUID;
                IntPtr iTestComObject;
                int    hr = Marshal.QueryInterface(trackerObjRaw, ref iid, out iTestComObject);

                Assert.Equal(0, hr);
                var nativeWrapper = new ITrackerObjectWrapper(iTestComObject);

                nativeWrapper = (ITrackerObjectWrapper)cw.GetOrRegisterObjectForComInstance(trackerObjRaw, CreateObjectFlags.None, nativeWrapper);

                // Set this on the return instead of during creation since the returned wrapper may be the one from
                // the internal cache and not the one passed in above.
                nativeWrapper.ReregisterForFinalize = true;

                return(new WeakReference <ITrackerObjectWrapper>(nativeWrapper, trackResurrection: true));
            }
コード例 #2
0
ファイル: Program.cs プロジェクト: happenzh/runtime
        static void ValidatePrecreatedExternalWrapper()
        {
            Console.WriteLine($"Running {nameof(ValidatePrecreatedExternalWrapper)}...");

            var cw = new TestComWrappers();

            // Get an object from a tracker runtime.
            IntPtr trackerObjRaw = MockReferenceTrackerRuntime.CreateTrackerObject();

            // Manually create a wrapper
            var    iid = typeof(ITrackerObject).GUID;
            IntPtr iTestComObject;
            int    hr = Marshal.QueryInterface(trackerObjRaw, ref iid, out iTestComObject);

            Assert.AreEqual(hr, 0);
            var nativeWrapper = new ITrackerObjectWrapper(iTestComObject);

            // Register wrapper, but supply the wrapper.
            var nativeWrapper2 = (ITrackerObjectWrapper)cw.GetOrRegisterObjectForComInstance(trackerObjRaw, CreateObjectFlags.TrackerObject, nativeWrapper);

            Assert.AreEqual(nativeWrapper, nativeWrapper2);

            // Ownership has been transferred to the wrapper.
            Marshal.Release(trackerObjRaw);

            // Validate reuse of a wrapper fails.
            IntPtr trackerObjRaw2 = MockReferenceTrackerRuntime.CreateTrackerObject();

            Assert.Throws <NotSupportedException>(
                () =>
            {
                cw.GetOrRegisterObjectForComInstance(trackerObjRaw2, CreateObjectFlags.None, nativeWrapper2);
            });
            Marshal.Release(trackerObjRaw2);

            // Validate passing null wrapper fails.
            Assert.Throws <ArgumentNullException>(
                () =>
            {
                cw.GetOrRegisterObjectForComInstance(trackerObjRaw, CreateObjectFlags.None, null);
            });
        }