1

別の言語を C# コードに変換する C# プログラムを作成しようとしています。プログラムは正常に動作し、コードを変換して .cs ファイルに書き込みます。このファイルを自動的にコンパイルして実行したいのですが、C# でこれを行う方法がわかりません。

作成したバッチ ファイルを実行するだけで手動で実行できます。System.Diagnostics.Process クラスを使用して C# からこのバッチ ファイルを実行しようとしました。実行すると、バッチコード自体にエラーが発生し、コマンドが見つからなかったことが示されました(通常の「実行可能ファイル、バッチファイルなどではありません」)。正常に実行される理由はわかりませんが、C# から実行した場合はそうではありません。

バッチ ファイルのコードは次のとおりです: C:\Program_Files_(x86)\Microsoft_Visual_Studio 10.0\VC\bin\amd64\vcvars64.bat csc %1.cs pause

そしてそれを呼び出す関数:

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

どんな助けでも大歓迎です。

4

2 に答える 2

7

バッチ スクリプトを使用して、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);
        }
    }
}
于 2011-10-11T04:55:39.653 に答える
0

CSharpCodeProviderクラスを使用して、C# 内でコードをプログラムでコンパイルできます。

于 2011-10-11T04:49:58.413 に答える