【问题标题】:Avoid memory leak in c# client of a unmanaged DLL with memory leak避免内存泄漏的非托管 DLL 的 C# 客户端中的内存泄漏
【发布时间】:2014-05-21 08:46:28
【问题描述】:

不幸的是,我必须在 C# 客户端中使用带有 内存泄漏的本机 C++ DLL。

我想知道是否有避免在我的 c# 应用程序中出现这种内存泄漏的好方法?

实际上,我尝试多次加载/卸载我的 DLL 以避免内存占用,但我不确定它是否可以避免内存泄漏:

// Dynamically load DLL file
NativeMethods.LoadLibrary(...)

// Do stuffs with the DLL
... (call compute method)

// Dynamically unload DLL file
NativeMethods.FreeLibrary(...)

// Dynamically load DLL file
NativeMethods.LoadLibrary(...)

// Do stuffs with the DLL
... (call compute method)

// Dynamically unload DLL file
NativeMethods.FreeLibrary(...)

etc...

谢谢

【问题讨论】:

  • "我不确定它是否能避免内存泄漏" 那么你如何能够首先检测到内存泄漏呢?你有证据证明它泄漏了吗?要么你有一个泄漏的测试用例,要么你没有。如果这样做,请实施您的解决方案并再次测试。它要么有效,要么无效。

标签: c# dll memory-leaks unmanaged


【解决方案1】:

根据我的理论,这不会改变任何事情。 在 C#/managed 中,与将 DLL 加载到本机程序中没有什么不同。 DLL 将分配堆内存,并且由于该资源属于进程,因此即使 DLL 被卸载,它也会持续存在。

如果您有一个纯托管的 DLL,情况会有所改变。然后,您可以将其加载到应用程序域中并将 DLL 与应用程序域一起处理...

所以解决方案? 困难的方法类似于具有 32 位 DLL 问题的 64 位进程。 创建一个单独的进程,加载 DLL 并进行远程调用。这很麻烦,但如果它只是一个 vew 调用,它可能是值得的。

其他: 不是我知道的,而是修复 DLL 的代码。

【讨论】:

    【解决方案2】:

    如果你在c#中使用了任何第三方dll,我们必须在不使用时手动删除

    通过使用以下命令手动删除对象引用。 GC.SuppressFinalize()

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 2016-02-13
      • 1970-01-01
      • 2020-07-11
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多