我有一个WPF应用程序,它运行扫描程序(通过C ++ com对象),创建一个(相当大的)tiff文件并将其存储在磁盘上。大部分繁重的工作都是用C ++完成的。
程序一次扫描大块页面(例如平装书中的50页),并将它们存储在tiff中。
最近,我添加了一些代码以从每个块中带回几页,因此我直观地看到了扫描工作正常。
事实证明,这已导致大量内存泄漏。
我很确定这是由于没有处理内存,而是:)在何处?
我的直接问题是我正在尝试在c#模块中使用DeleteObject,它将无法编译。
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);
编译器告诉我
名称空间不能直接包含字段或方法之类的成员
但是我看不到我在做什么错。
从内存泄漏的大小(20MB ish)来看,我认为问题出在c#端,但是如果我遗漏了一些东西,这是全部代码的片段。
C ++
STDMETHODIMP CWiaDevice::get_Image(SHORT Index, HBITMAP* pVal)
{
if (Index >= mStreams.Count())
{
return E_INVALIDARG;
}
if (Index < 0)
{
return E_INVALIDARG;
}
if (mLastBitmap != NULL)
{
return E_UNEXPECTED;
}
mLastBitmap = Bitmap::FromStream(mStreams[Index]);
Gdiplus::Status status = mLastBitmap->GetHBITMAP(Color::Black, pVal);
if (status != Ok)
return E_FAIL;
return S_OK;
}
STDMETHODIMP CWiaDevice::ReleaseImage()
{
if (mLastBitmap != NULL)
{
delete mLastBitmap;
mLastBitmap = NULL;
}
return S_OK;
}
C#
img = mDevice.Image[0];
SetImage(imgTop, img);
mDevice.ReleaseImage();
和
private void SetImage(Image img, IntPtr bmp)
{
var options = BitmapSizeOptions.FromEmptyOptions();
img.Source = Imaging.CreateBitmapSourceFromHBitmap(bmp, IntPtr.Zero, Int32Rect.Empty, options);
img.InvalidateMeasure();
}
我打算在创建img.Source之后,通过上述方法将DeleteObject放在bmp上。我想我不需要显式处理以前创建的img.Source,并且看不到任何实现方法。
非常感谢任何帮助。
伊恩
答案 0 :(得分:0)
名称空间不能直接包含字段或方法之类的成员
该错误消息告诉您不能将方法直接放置在名称空间中。该方法必须在一个类中,您将其放置在名称空间中。这是一个静态方法,因此您无需创建该类的实例,但是语言规则意味着您仍然需要此类。