标签: compileassemblyfromsource

如何防止CompileAssemblyFromSource泄漏内存?

我有一些C#代码使用CSharpCodeProvider.CompileAssemblyFromSource在内存中创建一个程序集.在对程序集进行垃圾回收之后,我的应用程序使用的内存比创建程序集之前的内存要多.我的代码在ASP.NET Web应用程序中,但我在WinForm中重复了这个问题.我正在使用System.GC.GetTotalMemory(true)和Red Gate ANTS Memory Profiler来测量增长(使用示例代码大约600个字节).

从我的搜索开始,听起来泄漏来自新类型的创建,而不是来自我所持有的任何对象.我发现的一些网页提到了有关AppDomain的一些内容,但我不明白.有人可以解释这里发生了什么以及如何解决它?

以下是泄漏示例代码:

private void leak()
{
    CSharpCodeProvider codeProvider = new CSharpCodeProvider();
    CompilerParameters parameters = new CompilerParameters();
    parameters.GenerateInMemory = true;
    parameters.GenerateExecutable = false;

    parameters.ReferencedAssemblies.Add("system.dll");

    string sourceCode = "using System;\r\n";
    sourceCode += "public class HelloWord {\r\n";
    sourceCode += "  public HelloWord() {\r\n";
    sourceCode += "    Console.WriteLine(\"hello world\");\r\n";
    sourceCode += "  }\r\n";
    sourceCode += "}\r\n";

    CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sourceCode);
    Assembly assembly = null;
    if (!results.Errors.HasErrors)
    {
        assembly = results.CompiledAssembly;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新1:此问题可能相关:动态加载和卸载使用CSharpCodeProvider生成的all

更新2:尝试更多地了解应用程序域,我发现: …

c# memory-leaks appdomain marshalling compileassemblyfromsource

30
推荐指数
3
解决办法
1万
查看次数

C#CompileAssemblyFromSource,添加它需要的引用程序集?

我有CompileAssemblyFromSource工作的代码只引用我的程序(编译它)使用的程序集.它工作得很漂亮.

但是,如果我需要编译具有"使用blah"的代码 声明,它将无法找到blah并说它缺少资源.

因此,如果它是"System.Windows.Forms",并且我说"compilerparams.ReferencedAssemblies.Add("System.Windows.Forms.dll")",它可以工作.

所以我可以解析代码文件并获取所有"使用"参数,但我怎么知道那些应该是"*.dll"添加,或者它们是其他地方的命名空间或诸如此类的?有没有办法让.NET接收"System.Windows.Forms"并吐出"System.Windows.Forms.dll",因为这是它需要的东西等等?

c# compileassemblyfromsource

7
推荐指数
1
解决办法
2611
查看次数

f#powerPack codeDom中的"CompileAssemblyFromSource"

我正在尝试使用基本程序来动态编译和运行f#代码.我试图运行以下代码:

open System 
open System.CodeDom.Compiler 
open Microsoft.FSharp.Compiler.CodeDom 

// Our (very simple) code string consisting of just one function: unit -> string 
let codeString =
"module Synthetic.Code\n    let syntheticFunction() = \"I've been compiled on the      fly!\""
// Assembly path to keep compiled code
let synthAssemblyPath = "synthetic.dll"

let CompileFSharpCode(codeString, synthAssemblyPath) =
    use provider = new FSharpCodeProvider() 
    let options = CompilerParameters([||], synthAssemblyPath) 
    let result = provider.CompileAssemblyFromSource( options, [|codeString|] ) 
    // If we missed anything, let compiler show us what's the problem
    if …
Run Code Online (Sandbox Code Playgroud)

f# codedom dynamic compileassemblyfromsource powerpack

5
推荐指数
1
解决办法
689
查看次数

防止CompileAssemblyFromSource生成具有重复文件名的临时文件

我的WCF应用程序使用在运行时编译的代码来计算报告的某些值.我正在使用CSharpCodeProvider.CompileAssemblyFromSource来编译代码.如果客户端(Silverlight应用程序)在计算另一个报告时请求报告,则CSharpCodeProvider.CompileAssemblyFromSource会生成具有重复名称的临时文件,这会导致IOException("文件'C:\ Windows\TEMP\uviewdyd.out'已经存在的.")

有谁知道如何防止这种情况?

c# wcf compileassemblyfromsource

5
推荐指数
1
解决办法
647
查看次数

.NET CompileAssemblyFromSource:确定哪个源失败了?

我正在动态编译代码,使用CompileAssemblyFromSource多个源代码.

如果发生编译错误,我可以从Errors集合中检索行号等.

但是,行号是所有来源中的行号.我需要的是失败源中的源和行号(在添加的源中).

没有做计算杂技会有可能吗?

.net c# compilation dynamic compileassemblyfromsource

5
推荐指数
1
解决办法
814
查看次数