C#的CodeDom编译器

ozd*_*ies 2 c# compiler-construction codedom

我一直在努力让CodeDom工作,所以我可以在运行时为我的应用程序动态创建代码.然而,经过许多教程和反复试验,我遇到了一个我似乎无法通过的问题.我一直在代码看起来完全像应该编译错误.当我的代码中没有'\'时,我得到"无法识别的转义序列'\'".

我得到的错误都在第1行.这里它们是有序的:CS1009 CS1056(连续3次)CS0116

这是我有的:

正在编译的代码:

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

编译器代码如下:

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

有什么我不做的编译吗?有什么我想念的吗?我有点迷失在这里.提前致谢.

mlo*_*ske 5

立即想到三件事:

  1. 您尝试编译的代码中没有分号.
  2. 如果Main应该是您的入口点,请将其设为静态.
  3. 使源文件与目标文件不同(类似于 param.OutputAssembly = file + ".exe";

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

MSDN上的一个很好的例子

  • 将`CompileAssemblyFromSource`更改为`CompileAssemblyFromFile` (2认同)