2011-10-30 6 views
25

私のTextBoxにあるコードをコンパイルするコードが必要です(たとえば)。私が意味することは、プログラムを実行した後にコードをコンパイルしたいということです。これどうやってするの? Aliostadが彼の答えで述べたように、しかし、この解決策に注意して、アプリケーションでC#コードをコンパイルする

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

答えて

21

この記事を参照してください。

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

は、ここで彼らが提供するサンプルコードです。コンパイルされたコードが自分自身のAppDomainになっていることを確認する必要があります。そうしないと、メモリリークが発生します。

別々のAppDomainにコードをロードする方法については、この関連の質問を参照してください:

How can I prevent CompileAssemblyFromSource from leaking memory?

+0

私はそれがとても簡単かもしれないとは思わなかった...うわー!!! +1あなたの答え – Marco

+1

BTWこのコードサンプルは最小限に編集されています。私は個人的にそのエラーメッセージループで 'StringBuilder'を使用し、テキストボックスのテキストを追加するのではなく上書きします。 –

17

herehereを参照してください。

コンパイルして読み込んだコードはすべてアンロードできません。これによりメモリリークが発生する可能性があります。つまり、誰かが入力を続けてコードを変更してコンパイルすると、アセンブリがロードされ、最終的にメモリ不足になります。

の2番目のAppDomainを作成し、そこにアセンブリを読み込み、必要でない場合はAppDomainをアンロードします。

+3

私のコメントが見えませんでしたか? – Aliostad

+6

+1の2番目のAppDomain –

関連する問題