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

sha*_*oth 5 .net c# pinvoke bitmap hbitmap

我正在处理类似这样的代码(从这里开始

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());
}
Run Code Online (Sandbox Code Playgroud)

和MSDN说,每当我打电话Bitmap.GetHbitmap()我要叫DeleteObject()hBitmap释放非托管资源。

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

除了 P/Invoke 之外确实没有其他方法可以DeleteObject()调用 myhBitmap吗?

Dav*_*nan 5

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

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