public static T Using <T>(string manifest, Func <T> action)
        {
            var context = new UnsafeNativeMethods.ACTCTX
            {
                cbSize   = Marshal.SizeOf(typeof(UnsafeNativeMethods.ACTCTX)),
                lpSource = manifest
            };

            if (context.cbSize != 0x20)
            {
                throw new Exception("ACTCTX.cbSize is wrong");
            }

            var hActCtx = UnsafeNativeMethods.CreateActCtx(ref context);

            if (hActCtx == (IntPtr)(-1))
            {
                throw new Win32Exception();
            }

            try
            {
                var cookie = IntPtr.Zero;
                if (!UnsafeNativeMethods.ActivateActCtx(hActCtx, out cookie))
                {
                    throw new Win32Exception();
                }

                try
                {
                    return(action());
                }
                finally
                {
                    UnsafeNativeMethods.DeactivateActCtx(0, cookie);
                }
            }
            finally
            {
                UnsafeNativeMethods.ReleaseActCtx(hActCtx);
            }
        }
    static public void UsingManifestDo(string manifest, Action action)
    {
        UnsafeNativeMethods.ACTCTX context = new UnsafeNativeMethods.ACTCTX();
        context.cbSize = Marshal.SizeOf(typeof(UnsafeNativeMethods.ACTCTX));
        if (context.cbSize != 0x20)
        {
            throw new Exception("ACTCTX.cbSize is wrong");
        }
        context.lpSource = manifest;
        IntPtr hActCtx = UnsafeNativeMethods.CreateActCtx(ref context);

        if (hActCtx == (IntPtr)(-1))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        try     // with valid hActCtx
        {
            IntPtr cookie = IntPtr.Zero;
            if (!UnsafeNativeMethods.ActivateActCtx(hActCtx, out cookie))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
            try     // with activated context
            {
                action();
            }
            finally
            {
                UnsafeNativeMethods.DeactivateActCtx(0, cookie);
            }
        }
        finally
        {
            UnsafeNativeMethods.ReleaseActCtx(hActCtx);
        }
    }