Skompiluj Kod C# W Aplikacji

Chcę jakiś kod, który kompiluje kod, który jest w moim polu tekstowym (na przykład). Chodzi mi o to, że chcę skompilować kod po uruchomieniu programu. Jak mogę to zrobić?

Author: AusCBloke, 2011-10-30

2 answers

Zobacz ten artykuł:

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

Oto przykładowy kod, który dostarczają:

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

Jak Aliostad wspomniał w swojej odpowiedzi, bądź ostrożny z tym rozwiązaniem. Musisz upewnić się, że Twój skompilowany kod kończy się we własnym AppDomain, w przeciwnym razie doświadczysz wycieków pamięci.

Zobacz podobne pytanie jak załadować kod do osobnego AppDomain:

Jak mogę zapobiec CompileAssemblyFromSource od wyciekająca pamięć?

 21
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:22:41

Zobacz tutaj i Tutaj .

Po prostu bądź ostrożny , każdy kod, który jest skompilowany i załadowany, nie może być rozładowany. Może to spowodować wyciek pamięci , tzn. jeśli ktoś będzie wpisywał i zmieniał kod oraz kompilował go, zestawy zostaną załadowane i ostatecznie zabraknie Ci pamięci.

Jednym z rozwiązań jest utworzenie drugiej domeny AppDomain i załadowanie tam zestawu, a gdy nie jest to konieczne, rozładowanie AppDomain.

 17
Author: Aliostad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 08:56:44