【问题标题】:C# dynamic compilation of string and .cs fileC#动态编译字符串和.cs文件
【发布时间】:2011-07-17 18:24:05
【问题描述】:

我正在开发一个网站,用户可以在该网站上针对浏览器文本区域中的问题实施 C# 代码解决方案并将其提交。然后,服务器将编译该代码以及我在服务器上提供的预定义接口。将其视为一种策略设计模式;我提供一个策略界面,用户实现它。所以我需要在运行时一起编译一个字符串和一个预定义的 *.cs 文件。这是我现在只编译字符串部分的代码:

CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");

CompilerParameters parameters = new CompilerParameters();
parameters.OutputAssembly = "CodeOutputTest.dll";   // need to name this dynamically.  where to store it?
parameters.GenerateExecutable = false;
parameters.IncludeDebugInformation = false;

CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, request.Code);

用户会提交如下内容:

public class UserClass : IStrategy
{
     public string ExecuteSolution(string input)
     {
         // user code
     }
}

抛开安全问题不谈(这又是一个沉重的问题)...如何将它与我的预定义接口 *.cs 文件一起编译?还是有更好的处理方法?

谢谢!

【问题讨论】:

  • 除非您有充分的理由信任所有用户,否则我强烈建议您首先考虑安全问题。如果您确定没有办法安全地解决问题,那么确定如何解决问题就没有什么意义了。
  • 出于安全问题,我建议在它自己的 AppDomain 中运行。这也将允许您在构建程序集后“卸载”程序集。根据您的数量,您最终可能会在内存中保存成百上千/更多的程序集。
  • @TheSean,我不确定在另一个 AppDomain 中运行代码会增加多少安全性。 在部分信任下在另一个 AppDomain 中运行它。
  • 是的,这里的安全性绝对是一个问题。但是通过一些研究,我认为我应该能够以几乎没有任何特权的用户身份运行代码。我注意到 CompilerParameters 对象上的一些属性,例如 Evidence 或 UserToken 属性,它们可能有助于限制授予代码的访问权限。
  • 嘿 jturinetti,你做到了吗?我需要实现一些非常相似的东西。

标签: c# .net compiler-construction dynamic compilation


【解决方案1】:

CodeDomProvider.CompileAssemblyFromSource() 定义为

public virtual CompilerResults CompileAssemblyFromSource(
    CompilerParameters options, params string[] sources)

这意味着您可以从多个源文件编译一个程序集。比如:

codeProvider.CompileAssemblyFromSource(parameters, request.Code, otherCode);

另一个(可能更好)选项是引用已编译的包含您需要的代码的程序集。您可以使用CompilerParameters.ReferencedAssemblies

parameters.ReferencedAssemblies.Add("SomeLibrary.dll");

【讨论】:

  • 预编译你的界面!如果您不关心 DLL 文件,也可以考虑使用 CompilerParameters.GenerateInMemory = true。
  • 接口是预编译的 :) 它在我的服务层的一个单独的项目/DLL 中。我可能也会在内存中生成编译结果...谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多