WPF程序拒绝DllImport

时间:2018-07-28 08:14:54

标签: c# wpf interop pinvoke dllimport

我有一个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,并且看不到任何实现方法。

非常感谢任何帮助。

伊恩

1 个答案:

答案 0 :(得分:0)

  

名称空间不能直接包含字段或方法之类的成员

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