C# 如何释放并行.For中的DLL内存?

C# 如何释放并行.For中的DLL内存?,c#,memory,dll,unmanaged,parallel.for,C#,Memory,Dll,Unmanaged,Parallel.for,对于,我动态加载/卸载不同的DLL。 我注意到在“child”的末尾没有释放内存。在“根”并行之后,内存似乎松弛了 Parallel.For(0, 100, j => { // Do stuffs Parallel.For(0, maxIter, i => { // Dynamically load DLL file NativeMethods.LoadLibrary(...) // D

对于,我动态加载/卸载不同的DLL。 我注意到在“child”的末尾没有释放内存。在“根”
并行之后,内存似乎松弛了

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>选项编译的C++非托管代码。 每个库仅由
并行中的一个线程使用。For

你能解释一下吗


如何释放
并行程序中的DLL内存。对于

我找到了解决方案

事实上,我的本机DLL与msvcrt运行时动态链接(
/MD
选项)

每次我尝试执行
freebrary
MSVCRTXXX.dll
仍然被加载,因为它依赖于其他加载的dll。 这就是为什么所有非托管内存在并行之后都会被释放

这篇文章对我帮助很大:

我刚刚用msvcrt运行时的静态链接重新编译了本机DLL


现在,在调用“FreeLibrary”之后,内存完全放松了:-)

首先为什么要在并行循环中加载和卸载库?以最大限度地释放内存。我真的很想了解在这种情况下发生了什么。根据减量,每个进程都会引用计数。这意味着,如果refcount大于1,则调用FreeLibrary可能无法卸载库。因此,澄清问题:您的
NativeMethods.LoadLibrary
NativeMethods.freebrary
是如何实现的?他们正在加载哪些库?这些在并行化中是唯一的吗?同一个库是否可能同时存在于两个或多个并行的上下文中?我已经在许多具有不同名称的DLL中克隆了一个DLL(复制文件并重命名它)。每个“NativeMethods.LoadLibrary(…)”加载其中一个DLL。DLL是用MD选项编译的C++非托管代码。每个库仅由一个并行线程使用。是否可以读取“refcount”?