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

Posted

技术标签:

【中文标题】在 .NET Framework 4.0 的 AppDomain 中运行 codeCom 代码【英文标题】:Run a codeCom code in AppDomain in .NET Framework 4.0 【发布时间】:2013-01-17 09:22:59 【问题描述】:

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

【问题讨论】:

MSDN (msdn.microsoft.com/en-us/library/…) 包含迁移过时 API 的建议 我已经阅读了那里描述的建议。我对使用旧策略选项不感兴趣。我想迁移它,但在您提供的 msdn 链接中不够清楚。同样在CompilerParameters类的Evidence属性中也没有说如何迁移,即NET Framework 4.0中如何给编译器应用安全权限。 目标是应用安全策略权限来授予编译的程序集。我不知道如何翻译 objCompilerParameters.Evidence = AppDomain.CurrentDomain.Evidence;到一个有效的(不是过时的)dot NET Framework 4.0。 Code Access Security Policy Compatibility and Migration的可能重复 这样的方法是否适合您:***.com/questions/5997995/…?基本上编译您的程序集并将其加载到具有适当安全策略的 AppDomain 中? 【参考方案1】:

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

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

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

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

摘自二级透明度文章:

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

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

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

【讨论】:

以上是关于在 .NET Framework 4.0 的 AppDomain 中运行 codeCom 代码的主要内容,如果未能解决你的问题,请参考以下文章

.Net Framework 4.0 安装程序是不是包含 .Net Framework 3.5?

net framework 4.0 能运行在啥系统上

Win10系统无法安装.net framework 4.0怎么办

Win10系统无法安装.net framework 4.0怎么办

如何在win10上安装.net framework 4.0

如何在 .net framework 4.0 中压缩文件夹