gpt4 book ai didi

c# - 在 .NET Core 1.0 中在运行时编译和运行代码

转载 作者:可可西里 更新时间:2023-11-01 08:16:08 25 4
gpt4 key购买 nike

是否可以在新的 .NET Core(更好的 .NET 标准平台)中在运行时编译和运行 C# 代码?

我看过一些示例(.NET Framework),但它们使用的 NuGet 包与 netcoreapp1.0 (.NETCoreApp,Version=v1.0) 不兼容

最佳答案

选项 #1:使用完整的 C# 编译器编译程序集,加载它,然后从中执行方法。

这需要以下包作为 project.json 中的依赖项:

"Microsoft.CodeAnalysis.CSharp": "1.3.0-beta1-20160429-01",
"System.Runtime.Loader": "4.0.0-rc2-24027",

然后你可以使用这样的代码:

var compilation = CSharpCompilation.Create("a")
.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
.AddReferences(
MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location))
.AddSyntaxTrees(CSharpSyntaxTree.ParseText(
@"
using System;

public static class C
{
public static void M()
{
Console.WriteLine(""Hello Roslyn."");
}
}"));

var fileName = "a.dll";

compilation.Emit(fileName);

var a = AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.GetFullPath(fileName));

a.GetType("C").GetMethod("M").Invoke(null, null);

选项 #2:使用 Roslyn脚本。这将导致代码更简单,但目前需要更多设置:

  • 创建 NuGet.config 以从 Roslyn 每晚提要中获取程序包:

      <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <packageSources>
    <add key="Roslyn Nightly" value="https://www.myget.org/F/roslyn-nightly/api/v3/index.json" />
    </packageSources>
    </configuration>
  • 将以下包作为依赖项添加到 project.json(请注意,这是今天的包。将来您将需要不同的版本):

      "Microsoft.CodeAnalysis.CSharp.Scripting": "1.3.0-beta1-20160530-01",

    您还需要导入 dotnet(过时的“Target Framework Moniker”,which is nevertheless still used by Roslyn):

      "frameworks": {
    "netcoreapp1.0": {
    "imports": "dotnet5.6"
    }
    }
  • 现在您终于可以使用脚本了:

      CSharpScript.EvaluateAsync(@"using System;Console.WriteLine(""Hello Roslyn."");").Wait();

关于c# - 在 .NET Core 1.0 中在运行时编译和运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37526165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com