WPF程序拒绝DllImport



我有一个WPF应用程序,它运行一个扫描仪(通过C++com对象(,创建一个(相当大的(tiff文件并将其存储在磁盘上。大部分繁重的工作都是用C++完成的。

该程序一次扫描大块的页面(比如50页,来自平装书(,并将它们存储在tiff中。

最近,我添加了一些代码,从每个区块中带回几页,这样我就有了扫描正常的视觉指示

事实证明,这导致了大规模的内存泄漏。

我很确定这是由于没有处理内存,但在哪里:(?

我的直接问题是,我试图在c#模块中使用DeleteObject,但它不会编译。

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);

编译器告诉我

命名空间不能直接包含字段或方法等成员

但我看不出我做错了什么。

从内存泄漏的大小(20MB(来看,我认为问题出在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之后,用上面的方法将DeleteObject放在bmp上。来源我假设我不需要显式地处理img。我之前创建的源代码,看不到任何方法。

非常感谢任何协助。

Iain

命名空间不能直接包含字段或方法等成员

错误消息告诉您不能将方法直接放置在命名空间中。该方法必须在一个类中,该类位于命名空间中。这是一个静态方法,所以您不创建类的实例,但语言规则意味着您仍然需要这样一个类。

最新更新