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)); }
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); }); }