如何从内存问题保护导入的Win32 DLL到.NET应用程序

时间:2010-05-14 20:16:22

标签: .net winapi interop

我有一个需要使用旧版Win32 DLL的C#应用​​程序。 DLL几乎是它自己的应用程序,它有对话框,硬件操作等。当导入和使用这个DLL时,会出现一些问题:

  1. 拖动对话框(不是Windows 系统对话框,但由一个创建 跨托管代码应用程序的DLL) 导致UI不重绘。 此外,它生成一个系统 来自各种UI的内存异常 控件。
  2. 表现令人难以置信 慢。
  3. 似乎没有办法 卸载DLL所以内存永远不会 得到清理。当我们关闭我们的 托管应用程序,我们得到另一个记忆 异常。
  4. 目前我们导入每个方法调用:

    [DllImport("dllname.dll",
        EntryPoint = "MethodName", SetLastError = true,
        CharSet = CharSet.Auto, ExactSpelling = true,
        CallingConvention = CallingConvention.StdCall)]
    

1 个答案:

答案 0 :(得分:1)

我会创建一个exe包装器(可能是非托管的),它为您的新应用程序公开API。

另一种可能的解决方案是创建第二个UI线程,它只处理麻烦的DLL。不过,我更倾向于使用exe包装器,因为这种方法可以更优雅地处理OOM(如果需要,可以重新启动进程)。