WrappedIUnknown.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / Data / System / Data / ProviderBase / WrappedIUnknown.cs / 1 / WrappedIUnknown.cs

                            //------------------------------------------------------------------------------ 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// [....] 
// [....]
//----------------------------------------------------------------------------- 
 
namespace System.Data.ProviderBase {
 
    using System;
    using System.Data.Common;
    using System.Runtime.CompilerServices;
    using System.Runtime.ConstrainedExecution; 
    using System.Runtime.InteropServices;
    using System.Security; 
    using System.Security.Permissions; 
    using System.Threading;
 
    // We wrap the interface as a native IUnknown IntPtr so that every
    // thread that creates a connection will fake the correct context when
    // in transactions, otherwise everything is marshalled.  We do this
    // for two reasons: first for the connection pooler, this is a significant 
    // performance gain, second for the OLE DB provider, it doesn't marshal.
 
    internal class WrappedIUnknown : SafeHandle { 

        internal WrappedIUnknown() : base(IntPtr.Zero, true) { 
        }

        internal WrappedIUnknown(object unknown) : this() {
            if (null != unknown) { 
                RuntimeHelpers.PrepareConstrainedRegions();
                try {} finally { 
                    base.handle = Marshal.GetIUnknownForObject(unknown);    // 
                }
            } 
        }

        public override bool IsInvalid {
            get { 
                return (IntPtr.Zero == base.handle);
            } 
        } 

        internal object ComWrapper() { 
            // NOTE: Method, instead of property, to avoid being evaluated at
            // runtime in the debugger.
            object value = null;
            bool mustRelease = false; 
            RuntimeHelpers.PrepareConstrainedRegions();
            try { 
                DangerousAddRef(ref mustRelease); 

                IntPtr handle = DangerousGetHandle(); 
                value = System.Runtime.Remoting.Services.EnterpriseServicesHelper.WrapIUnknownWithComObject(handle);
            }
            finally {
                if (mustRelease) { 
                    DangerousRelease();
                } 
            } 
            return value;
        } 

        override protected bool ReleaseHandle() {
            // NOTE: The SafeHandle class guarantees this will be called exactly once.
            IntPtr ptr = base.handle; 
            base.handle = IntPtr.Zero;
            if (IntPtr.Zero != ptr) { 
                Marshal.Release(ptr); 
            }
            return true; 
        }
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// [....] 
// [....]
//----------------------------------------------------------------------------- 
 
namespace System.Data.ProviderBase {
 
    using System;
    using System.Data.Common;
    using System.Runtime.CompilerServices;
    using System.Runtime.ConstrainedExecution; 
    using System.Runtime.InteropServices;
    using System.Security; 
    using System.Security.Permissions; 
    using System.Threading;
 
    // We wrap the interface as a native IUnknown IntPtr so that every
    // thread that creates a connection will fake the correct context when
    // in transactions, otherwise everything is marshalled.  We do this
    // for two reasons: first for the connection pooler, this is a significant 
    // performance gain, second for the OLE DB provider, it doesn't marshal.
 
    internal class WrappedIUnknown : SafeHandle { 

        internal WrappedIUnknown() : base(IntPtr.Zero, true) { 
        }

        internal WrappedIUnknown(object unknown) : this() {
            if (null != unknown) { 
                RuntimeHelpers.PrepareConstrainedRegions();
                try {} finally { 
                    base.handle = Marshal.GetIUnknownForObject(unknown);    // 
                }
            } 
        }

        public override bool IsInvalid {
            get { 
                return (IntPtr.Zero == base.handle);
            } 
        } 

        internal object ComWrapper() { 
            // NOTE: Method, instead of property, to avoid being evaluated at
            // runtime in the debugger.
            object value = null;
            bool mustRelease = false; 
            RuntimeHelpers.PrepareConstrainedRegions();
            try { 
                DangerousAddRef(ref mustRelease); 

                IntPtr handle = DangerousGetHandle(); 
                value = System.Runtime.Remoting.Services.EnterpriseServicesHelper.WrapIUnknownWithComObject(handle);
            }
            finally {
                if (mustRelease) { 
                    DangerousRelease();
                } 
            } 
            return value;
        } 

        override protected bool ReleaseHandle() {
            // NOTE: The SafeHandle class guarantees this will be called exactly once.
            IntPtr ptr = base.handle; 
            base.handle = IntPtr.Zero;
            if (IntPtr.Zero != ptr) { 
                Marshal.Release(ptr); 
            }
            return true; 
        }
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK