如何在.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...
}
}
答案 0 :(得分:0)
安全策略不再适用于应用程序(请注意,.NET Framework配置工具已在Framework 4中消失)。在桌面上运行的应用程序以完全信任的方式执行。但是,您可以使用沙盒应用程序并以部分信任方式运行它们。
您必须完全删除对CompilerParameters.Evidence
的引用。
如果您不希望所有代码都被视为安全关键,则可以使用SecurityRulesAttribute和SecurityTranparentAttribute。
了解Security-Transparency。在框架4中添加了second level。
取自第二级透明度文章:
如果未指定任何属性,则运行时会解释所有代码 作为安全关键,除非安全关键违反了 继承规则(例如,覆盖或实现时 透明的虚拟或接口方法)。在那些情况下,方法 对安全至关重要。指定no属性会导致公共语言 运行时为您确定透明度规则。
ChrisWue建议的另一种选择。沙箱您的应用程序。有关如何在沙箱中执行程序集的快速介绍,请查看SecurityManager.GetStandardSandbox上的示例。
PS:据我所知,他们对CAS进行这些更改的原因是因为正确使用它非常复杂。我仍然对RequestMinimum
,RequestOptional
和RequestRefuse
安全措施感到困惑。