我们有一个 C++ 库(没有 MFC,没有 ATL),它为我们的 .NET 应用程序提供了一些核心功能。SWIG使用 C++ DLL生成 C# 程序集,该程序集可用于使用 PInvoke 访问其类/方法。这个 C# 程序集在我们的 .NET 应用程序中用于使用 C++ DLL 中的功能。
该问题与内存泄漏有关。在我们的 .NET 应用程序中,我的 .NET 代码中有一个循环,它从 C++ DLL 创建特定类的数千个实例。循环在创建实例时不断减慢,但如果我在循环内调用 GC.Collect() (我知道不建议这样做),处理速度会更快。为什么是这样?对类型调用 Dispose() 对速度没有任何影响。我预计使用 GC.Collect() 会降低程序速度,但事实恰恰相反。
SWIG 生成的每个类都有一个调用 Dispose() 的 ~destructor。每个 Dispose 方法在调用以释放非托管内存的语句周围都有一个 lock(this)。最后它调用 GC.SuppressFinalize。我们还在 Release 版本中偶尔看到 AccessViolationException。任何帮助将不胜感激。