File: infocard\client\System\IdentityModel\Selectors\SafeLibraryHandle.cs
Project: ndp\cdf\src\WCF\System.IdentityModel.Selectors.csproj (System.IdentityModel.Selectors)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IdentityModel.Selectors
{
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Runtime.InteropServices;
    using System.Runtime.ConstrainedExecution;
    using System.Runtime.CompilerServices;
    using Microsoft.InfoCards.Diagnostics;
    using Microsoft.Win32;
    using System.Security.Permissions;
    using Microsoft.Win32.SafeHandles;
 
    //
    // Summary:
    // A class to wrap a library handle for reliability.
    // When LoadLibrary returns, the runtime stores the resulting IntPtr 
    // into the already created SafeLibraryHandle. The runtime guarantees that 
    // this operation is atomic, meaning that if the P/Invoke method successfully returns, 
    // the IntPtr will be stored safely inside the SafeHandle. Once inside the SafeHandle, 
    // even if an asynchronous exception occurs and prevents LoadLibrary's SafeLibraryHandle return 
    // value from being stored, the relevant IntPtr is already stored within a managed object 
    // whose critical finalizer will ensure its proper release.
    //
    [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
    class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
 
        private SafeLibraryHandle()
            : base(true)
        {
 
        }
 
        protected override bool ReleaseHandle()
        {
#pragma warning suppress 56523
            return FreeLibrary(handle);
        }
 
 
        [DllImport("kernel32.dll",
            CharSet = CharSet.Unicode,
            ExactSpelling = true,
            SetLastError = true,
            CallingConvention = CallingConvention.StdCall)]
        internal static extern SafeLibraryHandle LoadLibraryW(
                    [MarshalAs(UnmanagedType.LPWStr)]
                    string dllname);
 
 
        [DllImport("kernel32.dll",
            CharSet = CharSet.Unicode,
            ExactSpelling = true,
            SetLastError = true,
            CallingConvention = CallingConvention.StdCall)]
        internal static extern bool FreeLibrary(IntPtr hModule);
    }
}