如何在。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中消失了)。在桌面上运行的应用程序以完全信任的方式执行。但是,您可以沙箱应用程序并以部分信任的方式运行它们。
您必须完全删除对CompilerParameters.Evidence
的引用。
你可以使用SecurityRulesAttribute和SecurityTranparentAttribute,如果你不希望所有的代码都被认为是安全关键的。
阅读Security-Transparency。在框架4中添加了第二个级别。
摘自第二级透明度文章:
如果不指定任何属性,运行时将解释所有代码作为安全关键,除非安全关键违反了继承规则(例如,在重写或实现透明虚拟或接口方法)。在这些情况下,方法safe-critical。不指定属性将导致使用公共语言运行时为您确定透明度规则。
ChrisWue建议的是另一种选择。沙盒您的应用程序。有关如何在沙盒中执行程序集的快速介绍,请参阅SecurityManager.GetStandardSandbox中的示例。
PS:据我所知,他们对CAS进行这些更改的原因是因为正确使用它非常复杂。我仍然对RequestMinimum
, RequestOptional
和RequestRefuse
安全行为感到困惑。