在 .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 进行这些更改的原因是因为正确使用它非常复杂。我仍然对RequestMinimum
、RequestOptional
和RequestRefuse
安全操作感到困惑。
【讨论】:
以上是关于在 .NET Framework 4.0 的 AppDomain 中运行 codeCom 代码的主要内容,如果未能解决你的问题,请参考以下文章
.Net Framework 4.0 安装程序是不是包含 .Net Framework 3.5?
Win10系统无法安装.net framework 4.0怎么办