Скомпилировать код C # в приложении - PullRequest
25 голосов
/ 30 октября 2011

Мне нужен код, который компилирует код, который находится в моем TextBox (например).Я имею в виду, что я хочу скомпилировать код после запуска программы.Как я могу это сделать?

Ответы [ 2 ]

21 голосов
/ 30 октября 2011

См. Эту статью:

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
            ;
    }
}

Как отметил Алиостад в своем ответе, будьте осторожны с этимрешение, хотя.Вам нужно убедиться, что ваш скомпилированный код заканчивается в своем собственном AppDomain, иначе вы будете испытывать утечки памяти.

См. Этот связанный вопрос о том, как загрузить код в отдельный AppDomain:

Как можно предотвратить утечку памяти в CompileAssemblyFromSource?

17 голосов
/ 30 октября 2011

См. здесь и здесь .

Только будьте осторожны , любой код, который скомпилирован и загружен, не может быть выгружен.Это может привести к утечке памяти , т. Е. Если кто-то продолжает набирать и изменять код и компилировать его, сборки загружаются, и в конечном итоге вам не хватит памяти.

Одним из решений является создание второй AppDomain и загрузите сборку туда, а когда не нужно, выгрузите AppDomain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...