C # динамическая компиляция строки и файла .cs - PullRequest
2 голосов
/ 17 июля 2011

Я работаю на веб-сайте, где пользователь может реализовать решение кода 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 файлом Или есть лучший способ справиться с этим?

Спасибо!

1 Ответ

3 голосов
/ 17 июля 2011

CodeDomProvider.CompileAssemblyFromSource() определяется как

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

Это означает, что вы можете собрать одну сборку из нескольких исходных файлов. Что-то вроде:

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

Другой (возможно, лучший) вариант - ссылаться на уже скомпилированную сборку, которая содержит необходимый код. Вы можете сделать это, используя CompilerParameters.ReferencedAssemblies:

parameters.ReferencedAssemblies.Add("SomeLibrary.dll");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...