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

How do I have DeleteObject() invoked on hBitmap other than by using P/Invoke?

我正在处理类似这样的代码(来自 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() 时,我必须在 hBitmap 上调用 DeleteObject() 来释放非托管资源。

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

除了P/Invoke真的没有别的办法让DeleteObject()叫我的hBitmap吗?

我认为除了使用 p/invoke 之外,没有其他方法可以从 C# 调用 DeleteObject

因此,如果您想避免这种意外进入非托管代码,那么您应该首先避免调用 GetHbitmap。你可以很容易地做到这一点。你想做一个BitmapSource。通过调用 BitmapSource.Create.

来做到这一点