2014-09-04 71 views
0

我已經做了一些四處張望,沒有人能夠回答這個問題。我有一個靜態的主要void,它看起來應該工作。不包含適用於入口點的靜態「主」方法;

編譯:

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(); 
    } 
} 

爲什麼我在這得到一個錯誤?我真的不明白。這個相同的代碼適用於我的其他項目。

+0

同樣的錯誤。還是行不通。 – user3818701 2014-09-04 22:25:14

+2

@SamIam在C#中沒有要求'Main'公開。 – 2014-09-04 22:25:57

+0

@ user3818701您是否嘗試將'CompilerParameters'實例的'MainClass'屬性設置爲'HelloWorldClass'? – 2014-09-04 22:30:47

回答

0

你可以檢查所有左括號都關門了,我可以看到一個缺少在最後的命名空間等等。還有,檢查是否有在其他類中聲明的任何其他的Main()類...

0

錯誤在於您必須設置名稱空間的大括號。您的來源必須如下所示:

using System; 

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

編譯器會拋出一個錯誤...你是正確的,但錯誤在該部分之前。 – 2014-09-04 22:37:35

+0

替換源文本的資源,並再次嘗試,如果問題是一個例外,你可以給我的消息和線? – hdkrus 2014-09-04 22:44:11

1

您的代碼沒有問題..我已經嘗試過。如果你用你提供的實際代碼替換你的Properties.Resources.source - 你會注意到有一個編譯器錯誤。這個問題因此是你的資源。仔細檢查一下。

也就是說,有一個名爲MainClass的屬性,您可以將其應用於CompilerParameters。這使您可以選擇入口點的位置。

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

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); 
      } 
     } 
    } 
} 

InitializeComponent()後內MainWindow()的代碼幾乎是照搬來自OP的代碼片段。例外情況是WinBody.Text =已更改爲WinBody.Text +=,以便連接多個錯誤消息;我在最後用Process.Start(Output);運行編譯的應用程序來驗證它打印Hello World!。它成功運行並打印Hello World!。如果我使用OP的source.txt並且支架缺失,我不會得到'yay'(這是正確的),並且文本框出現此錯誤:「Line number 15,Error Number:CS1513,'expected;」;「這是人們所期望的。

相關問題