CodeDom编译器C#版

本文关键字:编译器 CodeDom | 更新日期: 2023-09-27 18:24:15

我一直在尝试让CodeDom工作,这样我就可以在运行时为我的应用程序动态创建代码。然而,经过多次教程和试错,我遇到了一个似乎无法通过的问题。我不断地在看起来完全应该的代码上出现编译器错误。当我的代码中没有"''"时,我会得到"无法识别的转义序列"''"。

我得到的错误都在第1行。以下是它们的顺序:CS1009CS1056(连续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);
            }
        }
    }

有没有什么事情我没有把它编译好?有没有我遗漏的东西?我在这里有点迷路了。提前谢谢。

CodeDom编译器C#版

我马上想到三件事:

  1. 您试图编译的代码中没有分号
  2. 如果Main应该是你的入口点,那么让它成为静态的
  3. 使源文件与目标文件不同(例如param.OutputAssembly = file + ".exe";

修复这些问题实际上只是第一步,您还必须配置输出需要引用的程序集,在您使用的CompilerParameters上设置MainClass也不是一个坏主意。

MSDN 上的一个很好的例子