0

如何在 NET Framework 4.0 中运行当前 AppDomain 中的编译代码?下面的代码可以在 NET Framework 3.5 中运行,但是 objCompilerParameters.Evidence 在 NET Framework 4.0 中已经过时了,那么如何解决呢?

    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

安全策略不再应用于应用程序(请注意,.NET Framework 配置工具已在 Framework 4 中消失)。在桌面上运行的应用程序以完全信任的方式执行。但是,您可以沙箱应用程序并以部分信任的方式运行它们。

您将必须CompilerParameters.Evidence完全删除对的引用。

如果您不希望所有代码都被视为安全关键,则可以使用SecurityRulesAttributeSecurityTranparentAttribute 。

阅读有关安全透明度的信息。在框架 4 中添加了第二个级别

摘自二级透明文章:

如果您不指定任何属性,则运行时会将所有代码解释为安全关键代码,除非安全关键代码违反了继承规则(例如,在覆盖或实现透明虚拟或接口方法时)。在这些情况下,这些方法是安全关键的。不指定任何属性会导致公共语言运行时为您确定透明度规则。

ChrisWue 建议的是另一种选择。沙箱您的应用程序。有关如何在沙盒中执行程序集的快速介绍,请查看SecurityManager.GetStandardSandbox上的示例。

PS:据我了解,他们对 CAS 进行这些更改的原因是因为正确使用它非常复杂。RequestMinimum我仍然对,RequestOptionalRequestRefuse安全操作感到困惑。

于 2013-01-17T23:49:38.087 回答