我已经做了一些环顾四周,没有人能够回答这个问题。我有一个静态的主要空虚,它看起来应该有效。
编译器:
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 :(得分:1)
你的代码没有问题..我试过了。如果将Properties.Resources.source
替换为您提供的实际代码 - 您会注意到编译器出错。因此,问题是你的资源。仔细检查一下。
也就是说,有一个名为MainClass
的属性可以应用于CompilerParameters
。这使您可以选择入口点的位置。
答案 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,'}预期;”这是人们所期望的。