日期:2014-05-17  浏览次数:20971 次

动态编译产生的程序集怎么释放
动态编译产生的程序集需要释放吗?如果需要释放该怎么释放?

            CSharpCodeProvider provider = new CSharpCodeProvider();
            CompilerParameters parameter = new CompilerParameters();
            parameter.ReferencedAssemblies.Add("System.dll");
            parameter.IncludeDebugInformation = false;//不包含调试信息
            parameter.GenerateExecutable = false; //<--不生成exe
            parameter.GenerateInMemory = true; //<--直接在内存运行
            string codeBlock = GenerateCodeBlocks(formula);
            CompilerResults result = provider.CompileAssemblyFromSource(parameter, codeBlock);

            //编译成功
            if (result.Errors.Count > 0)
            {
                throw new Exception("函数编译失败");
            }


上面的代码发现随着程序运行时间的变长,内存占用一直增长。如果把这部分注释掉,内存占用基本不变。

------解决方案--------------------
CreateDomain再运行
http://stackoverflow.com/questions/1799373/how-can-i-prevent-compileassemblyfromsource-from-leaking-memory
  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
------解决方案--------------------
对于托管代码来说,程序集没有释放这种说法,想要释放只能是创立应用程序域,因为应用程序域有释放的说法。