File: src\Framework\MS\Internal\PtsHost\UnmanagedHandle.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//---------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation.  All rights reserved.
// 
// File: UnmanagedHandle.cs
//
// Description: Definition for Unmanaged Handle. Provides identity (handle), 
//              which can be used in unmanaged world. 
//
// History:  
//  05/02/2003 : Microsoft - moving from Avalon branch.
//
//---------------------------------------------------------------------------
 
using System;
 
namespace MS.Internal.PtsHost
{
    /// <summary>
    /// Provides identity (handle), which can  be used in unmanaged world.
    /// If object is passed into unmanaged world, and there is a need to identify 
    /// that object later on, its class should inherit from UnmanagedHandle.
    /// </summary>
    internal class UnmanagedHandle : IDisposable
    {
        /// <summary>
        /// Constructor. Used when object derives from UnmanagedHandle.
        /// </summary>
        /// <param name="ptsContext">
        /// PTS context
        /// </param>
        protected UnmanagedHandle(PtsContext ptsContext)
        {
            _ptsContext = ptsContext;
            _handle = ptsContext.CreateHandle(this);
        }
 
        /// <summary>
        /// Dispose the object and release handle. 
        /// </summary>
        public virtual void Dispose()
        {
            try
            {
                _ptsContext.ReleaseHandle(_handle);
            }
            finally
            {
                _handle = IntPtr.Zero;
            }
            GC.SuppressFinalize(this);
        }
 
        /// <summary>
        /// Handle of an object. 
        /// </summary>
        internal IntPtr Handle 
        { 
            get 
            { 
                return _handle; 
            } 
        }
        private IntPtr _handle;
 
        /// <summary>
        /// PtsContext that is the owner of the handle.
        /// It is required to store it here for Dispose. When Dispose is called
        /// it is not always possible to get instance of PtsContext that
        /// has been used to create this handle. 
        /// </summary>
        internal PtsContext PtsContext { get { return _ptsContext; } }
        private readonly PtsContext _ptsContext;
    }
}