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

问题描述 投票:0回答:1

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

c# .net dynamic compilation codedom
1个回答
3
投票

CodeDomProvider.CompileAssemblyFromSource()
定义为

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

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

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

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

CompilerParameters.ReferencedAssemblies
:

来完成此操作
parameters.ReferencedAssemblies.Add("SomeLibrary.dll");
© www.soinside.com 2019 - 2024. All rights reserved.