コード例 #1
0
        internal static void FreeComObject <T>(ref T obj)
            where T : class
        {
#if false
            // When debug -> use special version, that writes debug information
            ComDebug.DebugFreeComObject(ref obj);
#else
            // take it to local variable
            var localObj = Interlocked.Exchange(ref obj, null);
            // if it is already null -> return
            if (localObj == null)
            {
                return;
            }
            Marshal.ReleaseComObject(localObj);
#endif
        }
コード例 #2
0
        public void IsOperatorRefCounterTest()
        {
            // operator is is NOT increment counters
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);

            bool test = item1 is nsIArray;

            int comCount2 = ComDebug.GetComRefCount(item1);
            int rcwCount2 = ComDebug.GetRcwRefCount(item1);

            int free = Marshal.ReleaseComObject(item1);

            Assert.AreEqual(0, comCount2 - comCount1);
            Assert.AreEqual(0, rcwCount2 - rcwCount1);
            Assert.AreEqual(0, free);
        }
コード例 #3
0
        public void QueryInterfaceRefCounterTest()
        {
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);

            var item2 = Xpcom.QueryInterface <nsIArray>(item1);

            int comCount2 = ComDebug.GetComRefCount(item2);
            int rcwCount2 = ComDebug.GetRcwRefCount(item2);


            int free1 = Marshal.ReleaseComObject(item2);
            int free2 = Marshal.ReleaseComObject(item1);

            Assert.AreEqual(0, comCount2 - comCount1);
            Assert.AreEqual(1, rcwCount2 - rcwCount1);
            Assert.AreEqual(1, free1);
            Assert.AreEqual(0, free2);
        }
コード例 #4
0
        public void ExplicitOperatorRefCounterTest()
        {
            // operator explicit is NOT increment counters
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);

            int comCount = ComDebug.GetComRefCount(item1);
            int rcwCount = ComDebug.GetRcwRefCount(item1);

            nsIArray item2 = (nsIArray)item1;

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);
            int comCount2 = ComDebug.GetComRefCount(item2);
            int rcwCount2 = ComDebug.GetRcwRefCount(item2);

            int free = Marshal.ReleaseComObject(item2);

            Assert.AreEqual(0, comCount2 - comCount1);
            Assert.AreEqual(0, rcwCount2 - rcwCount1);
            Assert.AreEqual(0, comCount2 - comCount);
            Assert.AreEqual(0, rcwCount2 - rcwCount);
            Assert.AreEqual(0, free);
        }