除了使用 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
.
来做到这一点
我正在处理类似这样的代码(来自 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
.