C# C语言的CodeDom编译器#

C# C语言的CodeDom编译器#,c#,compiler-construction,codedom,C#,Compiler Construction,Codedom,我一直在尝试让CodeDom工作,以便在运行时为我的应用程序动态创建代码。然而,经过许多教程和反复试验,我遇到了一个似乎无法通过的问题。我不断地在代码上遇到编译器错误,这些代码看起来和应该的完全一样。当代码中没有“\”时,我会得到“无法识别的转义序列“\” 我得到的错误都在第1行。按顺序排列如下: CS1009 CS1056(连续3次) CS0116 以下是我所拥有的: 正在编译的代码: using System; using System.Windows.Forms; namespace sd

我一直在尝试让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;
        }
    }
}
编译代码如下:

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);
            }
        }
    }
public void编译(字符串文件)
{
var prov=新字典();
批准添加(“CompilerVersion”、“v2.0”);
CSharpCodeProvider c=新的CSharpCodeProvider();
ICodeCompiler comp=c.CreateCompiler();
CompilerParameters param=新的CompilerParameters();
param.GenerateExecutable=true;
param.outputasembly=文件+“.exe”;
参数referencedAssemblys.Add(“System.dll”);
param.referencedAssemblys.Add(“System.Windows.Forms.dll”);
if(c.Supports(GeneratorSupport.EntryPointMethod))
param.MainClass=“样本”;
CompilerResults results=comp.compileasemblyFromSource(参数,文件);
如果(results.Errors.Count>0)
{
foreach(结果中的编译器错误comperrr.Errors)
{
MessageBox.Show(“行号”+CompErr.Line+”,错误号:“+CompErr.ErrorNumber+”,“+CompErr.ErrorText+”;“+Environment.NewLine+Environment.NewLine”);
}
}
}

有没有什么我没有做的来编译它?有什么东西我错过了吗?我有点迷路了。提前感谢。

我马上想到三件事:

  • 您试图编译的代码中没有分号
  • 如果Main应该是您的入口点,则将其设置为静态
  • 使源文件不同于目标文件(类似于
    param.outputasembly=file+“.exe”;
  • 解决这些问题实际上只是第一步,您还必须配置输出需要引用的程序集,在您使用的编译器参数上设置MainClass也不是一个坏主意


    哪一行给出了错误?它是否在VS中编译?Shouldnt
    compileAsemblyFromSource()中
    包含
    源代码
    而不是
    文件
    ?编辑:我编辑了代码以表示已更改的。--分号已经放进去了。我想我忘记了在粘贴到这里之前重新添加它们。无论如何:将Main更改为static,选中。添加所有资源DLL,选中。MainClass=“Sample”,check.File output name different,check.Result:在完全相同的行上有相同的5个错误。这是我不明白的,所有这些更改都有意义,但输出并不代表这一点。我甚至基本上从msdn复制了源代码,但没有成功。感谢您的帮助,但我必须继续查找。Change
    compileasemblyfromsource
    compileasemblyfromfile
    谢谢,这对我来说是一个非常简单的错误。在将其更改为FromFile并将main类更改为Namespace.Classname而不仅仅是Classname之后,我将其编译。感谢您指出,现在一切正常。