0

NET Framework 4.0 の現在の AppDomain でコンパイルされたコードを実行するにはどうすればよいですか? 以下はネット フレームワーク 3.5 で動作するコードですが、NET Framework 4.0 では objCompilerParameters.Evidence が廃止されているため、どうすれば解決できますか?

    protected void Button1_Click(object sender, EventArgs e)
{       
    VBCodeProvider objVBCodeProvider = new VBCodeProvider();
    CompilerParameters objCompilerParameters = new CompilerParameters();
    objCompilerParameters.ReferencedAssemblies.Add("System.dll");
    objCompilerParameters.Evidence = AppDomain.CurrentDomain.Evidence;
    objCompilerParameters.CompilerOptions = string.Empty;
    objCompilerParameters.GenerateExecutable = false;
    objCompilerParameters.GenerateInMemory = false;
    objCompilerParameters.IncludeDebugInformation = false;
    objCompilerParameters.TreatWarningsAsErrors = false;
    objCompilerParameters.WarningLevel = 0;
  objCompilerParameters.ReferencedAssemblies.Add(this.GetType().Assembly.Location);    


    // source contains the code, is of type string
    CompilerResults cr = objVBCodeProvider.CompileAssemblyFromSource(objCompilerParameters,source);
    if (cr.Errors.HasErrors)
    { Console.WriteLine("Error");
        foreach (CompilerError err in cr.Errors)
        { Console.WriteLine(err.ErrorText); } }
    else
    {
        // Some things...
    }
}
4

1 に答える 1

0

セキュリティポリシーはアプリケーションに適用されなくなりました(.NETFramework構成ツールがFramework4で廃止されたことに注意してください)。デスクトップ上で実行されるアプリケーションは、完全に信頼されて実行されます。ただし、アプリケーションをサンドボックス化して、部分的に信頼して実行することはできます。

への参照をCompilerParameters.Evidence完全に削除する必要があります。

すべてのコードをセキュリティクリティカルと見なしたくない場合は、 SecurityRulesAttributeSecurityTranparentAttributeを使用できます。

セキュリティについて読む-透明性。フレームワーク4では、2番目のレベルが追加されました。

第2レベルの透明性の記事からの抜粋:

属性を指定しない場合、セキュリティクリティカルであることが継承ルールに違反する場合を除いて、ランタイムはすべてのコードをセキュリティクリティカルとして解釈します(たとえば、透過的な仮想メソッドまたはインターフェイスメソッドをオーバーライドまたは実装する場合)。そのような場合、メソッドは安全で重要です。属性を指定しないと、共通言語ランタイムが透過性ルールを決定します。

ChrisWueが提案するのは別の選択肢です。アプリケーションをサンドボックス化します。サンドボックスでアセンブリを実行する方法の簡単な紹介については、SecurityManager.GetStandardSandboxの例を参照してください。

PS:私が理解している限り、彼らがCASにこれらの変更を加えた理由は、正しく使用するのが非常に複雑だったためです。私はまだRequestMinimumRequestOptionalおよびRequestRefuseセキュリティアクションに混乱しています。

于 2013-01-17T23:49:38.087 に答える