【问题标题】:C# - Compiling C# code at runtime results in errors that is "nonexistent"C# - 在运行时编译 C# 代码会导致“不存在”的错误
【发布时间】:2017-05-12 15:37:31
【问题描述】:

我试图在运行时将多个 C# 文件编译成一个可执行文件,如果我从 Visual Studio 运行此代码,我会不断收到不存在的编译器错误。

我从运行时编译器得到的具体错误是“;预期”和“方法必须具有返回类型”,位于“Program.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();
    }
}

MyBot.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”中的代码,一切正常,因此实际代码中没有错误。

【问题讨论】:

    标签: c# runtime csharpcodeprovider


    【解决方案1】:

    正如 Eric Lippert 所指出的,我使用的是比编译器更新的 .NET 版本。所以我只是将编译器更改为支持 C# 6 的新 Roslyn 编译器,这正是我所需要的。所以吸取了教训:始终确保您针对的是正确的框架版本。

    老答案

    Welp,我又要宣布自己是白痴了。最好在别人做之前自己做。

    我通过更改 Program.cs 文件使其正常工作。

    代替

    static void Main(string[] args) => new MyBot().RunAsync().GetAwaiter().GetResult();
    

    我做到了

    static void Main(string[] args)
    {
        new MyBot().RunAsync().GetAwaiter().GetResult();
    }
    

    但我仍然不知道为什么它在 Visual Studio 中工作后一开始就没有工作。

    【讨论】:

    • 您在 Visual Studio 中使用 C# 7,在其他任何编译环境中使用 C# 的早期版本。
    • @EricLippert 是的,当它变得更加清晰时,我有点发现了这一点。我需要运行 .NET 4.6+ 代码,但编译器似乎不能针对它。我需要进一步研究。
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多