不包含静态' Main'适合入境点的方法;

时间:2014-09-04 22:21:10

标签: c#

我已经做了一些环顾四周,没有人能够回答这个问题。我有一个静态的主要空虚,它看起来应该有效。

编译器:

CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
        string Output = "Out.exe";
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        //Make sure we generate an EXE, not a DLL
        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Properties.Resources.source);

        if (results.Errors.Count > 0)
        {
            foreach (CompilerError CompErr in results.Errors)
            {
                WinBody.Text = 
                            "Line number " + CompErr.Line +
                            ", Error Number: " + CompErr.ErrorNumber +
                            ", '" + CompErr.ErrorText + ";" +
                            Environment.NewLine + Environment.NewLine;
            }
        }
        else
        {
            //Successful Compile
            MessageBox.Show("yay");
        }

的Source.txt

using System;

namespace HelloWorld
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class HelloWorldClass
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        Console.ReadLine();
    }
}

为什么我收到错误?我真的不明白。这个代码适用于我的其他项目。

4 个答案:

答案 0 :(得分:1)

你的代码没有问题..我试过了。如果将Properties.Resources.source替换为您提供的实际代码 - 您会注意到编译器出错。因此,问题是你的资源。仔细检查一下。

也就是说,有一个名为MainClass的属性可以应用于CompilerParameters。这使您可以选择入口点的位置。

MSDN:http://msdn.microsoft.com/en-us/library/system.codedom.compiler.compilerparameters.mainclass(v=vs.110).aspx

答案 1 :(得分:0)

你能检查所有Open括号是否已关闭,我可以看到最后一个命名空间缺少...而且还检查你是否在其他类中声明了任何其他Main()类...

答案 2 :(得分:0)

错误是您必须设置命名空间的右括号。您的来源必须如下:

using System;

namespace HelloWorld
{
   /// <summary>
   /// Summary description for Class1.
   /// </summary>
   class HelloWorldClass
   {
       static void Main(string[] args)
       {
            Console.WriteLine("Hello World!");
            Console.ReadLine();
        }
    }
}

答案 3 :(得分:0)

您的source.txt文件不正确(不确定它是否被错误地粘贴到堆栈溢出中)。应该是:

using System;

namespace HelloWorld
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>

    class HelloWorldClass
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.ReadLine();
        }
    }
// Add missing bracket
}

您的编译器代码段不包含实际的主条目功能,但我在我自己的应用程序中尝试了您的代码。我创建了一个WPF C#应用程序(WpfApplication2),添加了source.txt,在主窗口中添加了WinBody文本框并使用了以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.CodeDom.Compiler;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {            
            InitializeComponent();
            CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
            string Output = "Out.exe";
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            //Make sure we generate an EXE, not a DLL
            parameters.GenerateExecutable = true;
            parameters.OutputAssembly = Output;
            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Properties.Resources.source);

            if (results.Errors.Count > 0)
            {
                foreach (CompilerError CompErr in results.Errors)
                {
                    WinBody.Text +=
                                "Line number " + CompErr.Line +
                                ", Error Number: " + CompErr.ErrorNumber +
                                ", '" + CompErr.ErrorText + ";" +
                                Environment.NewLine + Environment.NewLine;
                }
            }
            else
            {
                //Successful Compile
                MessageBox.Show("yay");
                //Run App
                Process.Start(Output);
            }
        }
    }
}

MainWindow()之后的InitializeComponent()内的代码几乎逐字逐句地从OP的代码段中获取。 WinBody.Text =的异常更改为WinBody.Text +=,以便连接多个错误消息;我使用Process.Start(Output);在最后运行已编译的应用程序,以验证它是否打印Hello World!。它成功运行并打印Hello World!。如果我使用缺少括号的OP的source.txt我没有'yay'(这是正确的)并且文本框有这个错误:“行号15,错误号码:CS1513,'}预期;”这是人们所期望的。