除了使用P / Invoke之外,我如何在hBitmap上调用DeleteObject()?

时间:2015-01-29 15:11:10

标签: c# .net bitmap pinvoke hbitmap

我正在处理类似这样的代码(来自here

using (var bmp = new System.Drawing.Bitmap(1000, 1000)) 
{
    IntPtr hBitmap = bmp.GetHbitmap(); 
    var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
        hBitmap, IntPtr.Zero, Int32Rect.Empty,
        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}

并且MSDN表示,每当我致电Bitmap.GetHbitmap()时,我都必须致电DeleteObject()上的hBitmap以释放非托管资源。

我见过的所有答案和MSDN说我必须P / Invoke DeleteObject()函数。这看起来有点疯狂,因为我获得了hBitmap没有P / Invoke,现在我突然需要使用P / Invoke来正确摆脱它。

除了P / Invoke之外,确实没有其他办法让DeleteObject()调用我的hBitmap吗?

1 个答案:

答案 0 :(得分:4)

除了使用p / invoke之外,我认为没有办法从C#调用DeleteObject

因此,如果您想避免这种不受欢迎的非托管代码,那么您应该首先避免调用GetHbitmap。你可以很容易地做到这一点。你想要BitmapSource。通过拨打BitmapSource.Create来执行此操作。