如何在Parallel.For中释放DLL内存?

时间:2014-05-21 14:57:16

标签: c# memory dll unmanaged parallel.for

在嵌套的Parallel.For中,我动态加载/卸载不同的DLL。 我注意到“孩子”Parallel.For结束时没有释放内存。 'root'Parallel.For之后,记忆似乎被重新发送

Parallel.For(0, 100, j =>
{
     // Do stuffs 

     Parallel.For(0, maxIter, i =>
      {
          // Dynamically load DLL file
          NativeMethods.LoadLibrary(...)

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

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

     // Do stuffs 
}

// Do stuffs (DLL Memory seems to be release only here, not before)

我在许多DLL中克隆了一个具有不同名称的DLL(复制文件并重命名)。 每个NativeMethods.LoadLibrary(...)加载其中一个DLL。 DLL是使用/MD选项编译的c ++非托管代码。 每个lib仅由Parallel.For

中的一个线程使用

你能解释一下吗?

如何在Parallel.For

中释放DLL内存

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。

实际上,我的本机DLL是动态地链接到msvcrt运行时(/MD选项)。

每次我尝试FreeLibrary时,MSVCRTXXX.dll仍会被加载,因为它取决于其他加载的DLL。 这就是为什么在Parallel.For

之后释放所有非托管内存的原因

这篇文章给了我很多帮助:Why does memory allocated from inside a DLL become invalid after FreeLibrary()?

我刚刚用msvcrt运行时的 static 链接重新编译了我的原生DLL。

现在,在FreeLibrary'之后,记忆完全被重新发布。致电: - )