C#字符串和.cs文件的动态编译
我正在开发一个网站,在这个网站上,用户可以在浏览器文本区域中实现一个问题的C代码解决方案并提交。然后,服务器将编译这些代码以及我在服务器上提供的预定义接口。将其视为一种战略设计模式;我提供了一个策略界面并由用户实现。所以我需要在运行时一起编译一个字符串和一个预定义的*.cs文件。下面是我现在拥有的代码,它只编译字符串部分:C#字符串和.cs文件的动态编译,c#,.net,compiler-construction,dynamic,compilation,C#,.net,Compiler Construction,Dynamic,Compilation,我正在开发一个网站,在这个网站上,用户可以在浏览器文本区域中实现一个问题的C代码解决方案并提交。然后,服务器将编译这些代码以及我在服务器上提供的预定义接口。将其视为一种战略设计模式;我提供了一个策略界面并由用户实现。所以我需要在运行时一起编译一个字符串和一个预定义的*.cs文件。下面是我现在拥有的代码,它只编译字符串部分: CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp"); CompilerParam
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文件一起编译?还是有更好的处理方法
谢谢 定义为
public virtual CompilerResults CompileAssemblyFromSource(
CompilerParameters options, params string[] sources)
这意味着您可以从多个源文件编译一个程序集。比如:
codeProvider.CompileAssemblyFromSource(parameters, request.Code, otherCode);
另一个(可能更好)选项是引用包含所需代码的已编译程序集。您可以使用以下方法执行此操作:
除非你有充分的理由信任所有的用户,否则我强烈建议你首先考虑安全问题。如果您确定没有安全的方法来解决问题,那么确定如何解决问题就没有多大意义。对于安全问题,我建议在自己的AppDomain中运行。这还允许您在生成程序集后“卸载”程序集。根据您的卷大小,您可能会在内存中保存成百上千个或更多的程序集。@因此,我不确定仅在另一个AppDomain中运行代码是否会增加安全性。在另一个AppDomain中以部分信任的方式运行它。是的,安全性肯定是一个问题。但是通过一点研究,我认为我应该能够以一个用户的身份运行代码,几乎没有任何特权。我注意到CompilerParameters对象上的一些属性,例如证据或UserToken属性,它们可能有助于限制授予代码的访问权限。嘿,jturinetti,你做到了吗?我需要实现一些非常类似的东西。预编译你的接口!如果你不关心DLL文件,也可以考虑使用CimuleMealths.GnEngEntEng=真,这个接口是预编译的:它在我的服务层中的一个单独的项目/ DLL中。我可能也会在内存中生成编译结果…谢谢。
parameters.ReferencedAssemblies.Add("SomeLibrary.dll");