在.net Framework 4.0的AppDomain中运行codeCom代码

本文关键字:运行 codeCom 代码 AppDomain net Framework | 更新日期: 2023-09-27 17:53:46

如何在。NET Framework 4.0中运行当前AppDomain中的编译代码?下面的代码在。net framework 3.5中工作,但是objCompilerParameters。证据是过时的。NET框架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...
    }
}

在.net Framework 4.0的AppDomain中运行codeCom代码

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

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

你可以使用SecurityRulesAttribute和SecurityTranparentAttribute,如果你不希望所有的代码都被认为是安全关键的。

阅读Security-Transparency。在框架4中添加了第二个级别。

摘自第二级透明度文章:

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

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

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