2013-06-14 11 views
12

私はCSharpCodeProviderを使用して、自分のアプリケーション用のインスタントプラグインをコンパイルします。CSharpCodeProvider.CompileAssemblyFromFileのエラーの最大量

今のところ、よく見えるが、バイナリファイルで貼り付けられたC#コードなど、多くのエラーを生成するファイルをコンパイルしようとする可能性があります。多くの文字があり、それはerror CS1056: Unexpected characterで処理されます。

この動作は予想されますが、このような「悪意のある」ファイルのコンパイルプロセスは非常に時間がかかります。

私が妥当であると思う解決策の1つは、エラーの数を制限することです。それ以降はCSharpCodeProvider.CompileAssemblyFromFileが返されます。

このような制限を設定することはできますか?

避けることが可能であれば、最初は非常に慎重にファイルを検査したくありません。

+2

*リモートの危険性がある場合*受信ファイルが悪意のあるものであると個人的にはコンパイラの近くに置いてもそれほど信頼できません。コンパイラが –

+0

@MarcGravellを見つけ出そうとすると、あまりにも高価ないくつかの興味深いケースがあります(Eric Lippertがリストを持っていることは間違いありません)。 (3SATについてのEric Lippertのブログ記事を参照)。ただし、コンパイル時にタイムアウトを設定すると安全です。 – SLaks

+0

@MarcGravell - あなたは有効なポイントを持っていますが、よく、私はファイルをロードして試してみたいと思っています。私はそれが危険であるかもしれないことを知っている、しかし、まあ、それは本当に私が欲しいものです。 –

答えて

1

これを制御できるCSharpCodeProviderのプロパティまたはフィールドがあるかどうかわかりませんが、問題が解決するまでに時間がかかっているのではなく、エラーの数、私の解決策は別のタスクでCSharpCodeProviderを実行することですが、完了には時間がかかりすぎる場合は、タスクを終了します。

その後、独自のエラーメッセージを提供することができます。

は、「あなたのコードがあまりにも悪いですこれは、5分未満でコンパイルすることはできません。」 :P

セキュリティに関しては、Application.Run経由で個別のAppDomainで動作させてみることができますか?あなたのアプリケーションはどれほど複雑かは分かりませんが、プラグインを注入してメインフォームの新しいインスタンスを開始することができます。

+0

意味はありますが、実際に私の問題は解決しません。私はこれまでに遭遇したエラーに関する情報を持っていたいと思っています(少なくとも最初のもの) –

+0

私が知る限り、CSharpCodeProviderインスタンスによって行われるコンパイルのエラーを取得する唯一の方法は、CompilerResultsのErrorsプロパティですそれはすべてをコンパイルした後に返されます。 CompileAssemblyFrom *が呼び出されたときに構築されるCompilerResultsオブジェクトを追跡できると仮定して、そのErrorsプロパティの基になるフィールドを取得するためにリフレクションを使用して、コンパイル中にその値をチェックすると思います。おそらく、そのフィールドはコレクションの一種になります。追加されたタスクを終了し、追加されたものをエラーに表示することができます。 –

+0

これは非常に遅く、実行されているコードを反映しており、別のスレッドでは実行できない場合もあります。それはまた非常にハッキリです。より良い答えを見つけたらこの質問を更新してください。今私はこのすべての研究を試して回答したので非常に不思議です); –

関連する問題