在应用程序中编译C#代码

26

我希望有一些代码,可以编译我的文本框中的代码(例如)。我的意思是,我想在运行程序后编译代码。我该如何实现?

2个回答

21

请参考这篇文章:

http://support.microsoft.com/kb/304655

以下是他们提供的示例代码:

var codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();

var parameters = new CompilerParameters()
{
    GenerateExecutable = true,
    OutputAssembly = Output,
};
CompilerResults results = icc.CompileAssemblyFromSource(parameters, sourceString);

if (results.Errors.Count > 0)
{
    foreach(CompilerError error in results.Errors)
    {
        textBox2.Text = textBox2.Text
            + "Line number " + error.Line
            + ", Error Number: " + error.ErrorNumber
            + ", '" + error.ErrorText + ";"
            + Environment.NewLine + Environment.NewLine
            ;
    }
}

正如Aliostad在他的答案中提到的那样,使用这种解决方案需要小心。你需要确保你的编译代码最终位于其自己的AppDomain中,否则你将会经历内存泄漏。

请参考这个相关问题,了解如何将代码加载到单独的AppDomain中:

如何防止CompileAssemblyFromSource泄漏内存?


1
顺便提一下,这个代码示例只进行了最小限度的编辑。我个人会在错误消息循环中使用 StringBuilder,并覆盖文本框的文本,而不是将其附加到末尾。 - Merlyn Morgan-Graham

17

请查看这里这里

要注意的是,任何编译和加载的代码都不能被卸载。这可能会导致内存泄漏,即如果有人不断地键入和更改代码并将其编译,则程序集会被加载,最终你的内存将耗尽。

一个解决方法是创建一个第二个AppDomain,在其中加载程序集,当不再需要时,卸载该AppDomain。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接