我正在尝试在运行时将多个C#文件编译为一个可执行文件,并且不断收到编译器错误,如果我从Visual Studio运行此代码,则不会出现这些错误。
我从运行时编译器得到的具体错误是";预期"和"方法必须具有返回类型"在"程序.cs"的第 7 行。显然,如果有需要修复的内容,我会解决这些问题。
所以代码。这是实际的编译器代码:(删除了一些部分,如实际的错误报告(
private CSharpCodeProvider provider = new CSharpCodeProvider();
private CompilerParameters parameters = new CompilerParameters();
private void RunOption_Click(object sender, RoutedEventArgs e)
{
parameters.GenerateInMemory = false;
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Path + "/builds/debug/bot.exe";
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Threading.Tasks.dll");
parameters.CompilerOptions = "/optimize";
parameters.WarningLevel = 3;
parameters.TreatWarningsAsErrors = false;
string[] filesToCompile = Directory.GetFiles(Path + "\src\", "*.cs");
CompilerResults results = provider.CompileAssemblyFromFile(parameters, filesToCompile);
}
这是它试图编译的两个文件。
程序.cs
using System.Threading.Tasks;
namespace MyBot
{
class Program
{
static void Main(string[] args) => new MyBot().RunAsync().GetAwaiter().GetResult();
}
}
我的机器人.cs
using System;
using System.Threading.Tasks;
namespace MyBot
{
public class MyBot
{
public async Task RunAsync()
{
Console.Title = "MyBot";
Console.Read();
}
}
}
我在这里错过了什么?如前所述,如果我在Visual Studio中运行"Program.cs"和"MyBot.cs"中的代码,一切正常,因此实际代码中没有错误。
正如 Eric Lippert 指出的那样,我使用的是比编译器更新的 .NET 版本。所以我只是将编译器更改为支持 C# 6 的新 Roslyn 编译器,这正是我所需要的。因此,吸取的教训:始终确保以正确的框架版本为目标。
旧答案
好吧,我要再次宣布自己是白痴。最好在其他人之前自己做。
我通过更改程序.cs文件使其工作。
而不是
static void Main(string[] args) => new MyBot().RunAsync().GetAwaiter().GetResult();
我做了
static void Main(string[] args)
{
new MyBot().RunAsync().GetAwaiter().GetResult();
}
但我仍然不知道为什么它一开始就不起作用,因为它在Visual Studio中工作。