public static void Save(this Metafile metafile, Stream stream, bool forceWmfFormat)
        {
            if (metafile == null)
            {
                throw new ArgumentNullException(nameof(metafile), PublicResources.ArgumentNull);
            }
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream), PublicResources.ArgumentNull);
            }
            if (!OSUtils.IsWindows)
            {
                throw new PlatformNotSupportedException(Res.RequiresWindows);
            }

            bool isWmf = metafile.RawFormat.Guid == ImageFormat.Wmf.Guid;

            if (isWmf || forceWmfFormat)
            {
                WriteWmfHeader(metafile, stream);
            }

            // making a clone, otherwise, it will not be usable after saving
            metafile = (Metafile)metafile.Clone();
            IntPtr handle = metafile.GetHenhmetafile();

            try
            {
                byte[] buffer = isWmf ? Gdi32.GetWmfContent(handle)
                        : (forceWmfFormat ? Gdi32.GetWmfContentFromEmf(handle) : Gdi32.GetEmfContent(handle));
                stream.Write(buffer, 0, buffer.Length);
            }
            finally
            {
                if (isWmf)
                {
                    Gdi32.DeleteMetaFile(handle);
                }
                else
                {
                    Gdi32.DeleteEnhMetaFile(handle);
                }
                metafile.Dispose();
            }
        }
        private void propertiesComboBox__SelectedIndexChanged(object sender, EventArgs e)
        {
            var selectedItem = propertiesComboBox_.SelectedItem;

            if (selectedItem == null)
            {
                return;
            }

            switch (selectedItem.ToString())
            {
            case "Metafile":
                propertyGrid_.SelectedObject = metafile_;
                break;

            case "MetafileHeader":
                propertyGrid_.SelectedObject = metafile_.GetMetafileHeader();
                break;

            case "ENHMETAHEADER":
                using (var metafile = MetafileUtility.CopyMetafile(ref metafile_))
                {
                    // Metafile.GetHenhmetafile is just a wrapper of GdipGetHemfFromMetafile:
                    // https://github.com/dotnet/runtime/blob/78c6505cffe2558b036fbe44cd27038affbb6cce/src/libraries/System.Drawing.Common/src/System/Drawing/Imaging/Metafile.Windows.cs#L379-L383
                    // and according to:
                    // http://www.jose.it-berater.org/gdiplus/reference/flatapi/graphics/gdipgethemffrommetafile.htm
                    // > GdipGetHemfFromMetafile:
                    // > This method sets the Metafile object to an invalid state. The user is responsible for calling DeleteEnhMetafile,
                    // > to delete the Windows handle.
                    var enhMetafileHandle = metafile.GetHenhmetafile();
                    if (enhMetafileHandle != IntPtr.Zero)
                    {
                        var header = Gdi32.GetEnhMetaFileHeader(enhMetafileHandle);
                        propertyGrid_.SelectedObject = new EnhMetaHeader(header);

                        Gdi32.DeleteEnhMetaFile(enhMetafileHandle);
                    }
                }
                break;

            default:
                Debug.Assert(false);
                break;
            }
        }