public DerivedObject(TestComWrappers comWrappersInstance) { IntPtr innerInstance = WeakReferenceNative.CreateAggregatedWeakReferenceObject( comWrappersInstance.GetOrCreateComInterfaceForObject(this, CreateComInterfaceFlags.None)); inner = new WeakReferenceableWrapper(innerInstance, comWrappersInstance.Registration, releaseInFinalizer: false); comWrappersInstance.GetOrRegisterObjectForComInstance(innerInstance, CreateObjectFlags.Aggregation, this); }
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); }); }
static void ValidateSuppliedInnerNotAggregation() { Console.WriteLine($"Running {nameof(ValidateSuppliedInnerNotAggregation)}..."); var cw = new TestComWrappers(); // Attempt to register a non-zero instance with a non-zero inner value without // indicating the scenario is aggregaion. var invalidInstance = new IntPtr(1); var invalidInner = new IntPtr(2); Assert.Throws <InvalidOperationException>( () => { cw.GetOrRegisterObjectForComInstance(invalidInstance, CreateObjectFlags.None, new object(), invalidInner); }); }