Запуск компилятора C # из программы C # - PullRequest
1 голос
/ 11 октября 2011

Я пытаюсь создать программу на C #, которая преобразует другой язык в код C #. У меня есть программа, работающая нормально, преобразовывая код и записывая его в файл .cs. Я хочу, чтобы этот файл автоматически компилировался и выполнялся, однако я не могу понять, как это сделать с C #.

Я могу сделать это вручную, просто запустив пакетный файл, который я написал, и я попытался запустить этот пакетный файл из C #, используя класс System.Diagnostics.Process. Когда он запускался, он выдавал ошибку в самом пакетном коде, говоря, что ни одна из команд не была найдена (обычный «не исполняемый файл, пакетный файл и т. Д.»). Я не могу понять, почему он работает нормально, но не при запуске из C #.

Вот код командного файла: C: \ Program_Files_ (x86) \ Microsoft_Visual_Studio 10.0 \ VC \ bin \ amd64 \ vcvars64.bat csc% 1.cs пауза

и вызывающая его функция:

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "compiler\\compile.bat";
process.StartInfo.Arguments = " "+fileName;
process.Start();
process.WaitForExit();
process.StartInfo.FileName = fileName + ".exe";
process.Start();
process.WaitForExit();
Console.WriteLine("done");

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

Не вызывайте компилятор C # или какой-либо компилятор платформ .net с помощью пакетного скрипта - это плохая практика.Вы можете сделать это, используя только C #.используя класс CodeDomProvider , вы можете легко написать это.

  static void CompileCSharp(string code) {
    CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
    ICodeCompiler compiler = provider.CreateCompiler();
    CompilerParameters parameters = new CompilerParameters();
    parameters.OutputAssembly = @"D:\foo.exe";
    parameters.GenerateExecutable = true;
    CompilerResults results = compiler.CompileAssemblyFromSource(parameters, code);
    if (results.Output.Count == 0)
    {
        Console.WriteLine("success!");
    }
    else
    {
        CompilerErrorCollection CErros = results.Errors;
        foreach (CompilerError err in CErros)
        {
            string msg = string.Format("Erro:{0} on line{1} file name:{2}", err.Line, err.ErrorText, err.FileName);
            Console.WriteLine(msg);
        }
    }
}
0 голосов
/ 11 октября 2011
...