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

时间:2013-01-17 09:23:00

标签: c# appdomain vbcodeprovider

如何在.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...
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

了解Security-Transparency。在框架4中添加了second level

取自第二级透明度文章:

  

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

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

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

相关问题