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ć?
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ęć?
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
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.
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