Компилятор CodeDom для C # - PullRequest
       44

Компилятор CodeDom для C #

2 голосов
/ 12 февраля 2012

Я пытался заставить CodeDom работать, чтобы я мог динамически создавать код для своего приложения во время выполнения. Тем не менее, после многих уроков и проб и ошибок я столкнулся с проблемой, которую, похоже, не могу решить. Я продолжаю получать ошибки компилятора в коде, который выглядит точно так, как должен. Я получаю "Нераспознанная escape-последовательность" \ ", когда в моем коде нет" \ ".

Все ошибки, которые я получаю, находятся в строке 1. Вот они в порядке: CS1009 CS1056 (3 раза подряд) CS0116

Вот что у меня есть:

Код компилируемого:

using System;
using System.Windows.Forms;
namespace sdjkfhj 
{    
    public class Sample 
    {
        public static void main()
        {
            MessageBox.Show("Working");
            return;
        }
    }
}

А код компилятора выглядит следующим образом:

public void Compile(string file)
    {
        var prov = new Dictionary<string, string>();
        prov.Add("CompilerVersion", "v2.0");
        CSharpCodeProvider c = new CSharpCodeProvider();
        ICodeCompiler comp = c.CreateCompiler();

        CompilerParameters param = new CompilerParameters();
        param.GenerateExecutable = true;
        param.OutputAssembly = file + ".exe";
        param.ReferencedAssemblies.Add("System.dll");
        param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
        if (c.Supports(GeneratorSupport.EntryPointMethod))
            param.MainClass = "Sample";

        CompilerResults results = comp.CompileAssemblyFromSource(param, file);

        if (results.Errors.Count > 0)
        {
            foreach (CompilerError CompErr in results.Errors)
            {
                MessageBox.Show("Line number " + CompErr.Line + ", Error Number: " + CompErr.ErrorNumber + ", '" + CompErr.ErrorText + ";" + Environment.NewLine + Environment.NewLine);
            }
        }
    }

Есть что-то, что я не делаю, чтобы правильно скомпилировать? Есть вещи, которые мне не хватает? Я как бы потерялся здесь. Заранее спасибо.

1 Ответ

5 голосов
/ 12 февраля 2012

На ум сразу приходят три вещи:

  1. В коде, который вы пытаетесь скомпилировать, нет точек с запятой.
  2. Если предполагается, что Main будет вашей точкой входа, сделайте ее статической.
  3. Сделайте ваш исходный файл отличным от вашего целевого файла (что-то вроде param.OutputAssembly = file + ".exe";

Исправить это действительно только первый шаг, вам также нужно будет настроить сборки, на которые будет ссылаться ваш вывод, и было бы неплохо установить MainClass для используемых вами параметров CompilerParameters.

Хороший пример на MSDN

...