0

以前は、CodeDOM CompilationUnits をファイルにエクスポートし、それらのファイルを読み込んで、CSharpCodeProvider を使用してコンパイルしていました。今日、CodeDOM が String にエクスポートされるようにコードをリファクタリングしました。

public static string compileToString(CodeCompileUnit cu){
        // Generate the code with the C# code provider.
        CSharpCodeProvider provider = new CSharpCodeProvider();

        using (StringWriter sw = new StringWriter())
        {
            IndentedTextWriter tw = new IndentedTextWriter(sw, "    ");

            // Generate source code using the code provider.
            provider.GenerateCodeFromCompileUnit(cu, tw,
                new CodeGeneratorOptions());

            tw.Close();

            return sw.ToString ();
        }   
    }

次に、CompileFromSource を使用するようにコンパイルを変更しました。

public static Assembly BuildAssemblyFromString(string code){
        Microsoft.CSharp.CSharpCodeProvider provider = 
           new CSharpCodeProvider();
        ICodeCompiler compiler = provider.CreateCompiler();
        CompilerParameters compilerparams = new CompilerParameters();
        compilerparams.GenerateExecutable = false;
        compilerparams.GenerateInMemory = true;

        compilerparams.CompilerOptions = "/nowarn:162";
        string[] files = new string[]{"TemplateAesthetic.cs"};

        CompilerResults results = 
           compiler.CompileAssemblyFromSource(compilerparams, code);
        if (results.Errors.HasErrors)
        {
            StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
            foreach (CompilerError error in results.Errors )
            {
                errors.AppendFormat("Line {0},{1}\t: {2}\n", 
                       error.Line, error.Column, error.ErrorText);
                Debug.Log (error.ErrorText);
            }
        }
        else
        {
            return results.CompiledAssembly;
        }
        return null;
    }

気づかせてくれた Maarten に感謝します。問題は、コンパイル プロセスに実際のファイル (TemplateAesthetic.cs) を含める必要があることですが、このコンパイルは文字列から行われます。CompileAssemblyFromSource を使用して、この方法で混合コンパイルを実行できますか?

4

1 に答える 1

1

最初の答え:

私が見る限り、変数string[] filesはどこにも使用されていません。コンパイラー・パラメーターのどこかに追加する必要がありますか?

アップデート:

使用しているメソッドは実際に を受け入れます。params string[] sourcesこれは、メソッドに複数の文字列を与えることができることを意味します。したがって、解決策は、ファイルをディスクからメモリ (文字列) に読み取り、すべてのソースを含む配列を作成し、その配列をメソッドに渡すことです。

これを変える:

CompilerResults = compiler.CompileAssemblyFromSource(compilerparams, code);

これに:

var fileContents = files.Select(x => File.ReadAllText(x)).ToList();
fileContents.Add(code);
CompilerResults results = compiler.CompileAssemblyFromSource(
    compilerparams, 
    fileContents
);

申し訳ありませんが、テストする時間がありません。

于 2013-07-09T12:07:10.290 に答える