Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#字符串和.cs文件的动态编译_C#_.net_Compiler Construction_Dynamic_Compilation - Fatal编程技术网

C#字符串和.cs文件的动态编译

C#字符串和.cs文件的动态编译,c#,.net,compiler-construction,dynamic,compilation,C#,.net,Compiler Construction,Dynamic,Compilation,我正在开发一个网站,在这个网站上,用户可以在浏览器文本区域中实现一个问题的C代码解决方案并提交。然后,服务器将编译这些代码以及我在服务器上提供的预定义接口。将其视为一种战略设计模式;我提供了一个策略界面并由用户实现。所以我需要在运行时一起编译一个字符串和一个预定义的*.cs文件。下面是我现在拥有的代码,它只编译字符串部分: CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp"); CompilerParam

我正在开发一个网站,在这个网站上,用户可以在浏览器文本区域中实现一个问题的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文件一起编译?还是有更好的处理方法

谢谢

定义为

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");