使用Roslyn API编译.NET Core App

时间:2017-09-22 14:08:08

标签: c# roslyn

我正在生成一些动态C#,并希望将其编译为.NET Core App。但是,似乎缺少deps.json文件以使其实际可运行。 因此编译本身可行,但在运行dotnet [name of dll]时会出错:

在代码中我做

  CSharpCompilation compilation = CSharpCompilation.Create(assemblyName,
    syntaxTrees: files,
    references: references,
    options: new CSharpCompilationOptions(OutputKind.ConsoleApplication,
      optimizationLevel: OptimizationLevel.Debug
    )
  );

  FileUtility.CreateDirectory(outputDllPath);
  EmitResult result = compilation.Emit(outputDllPath, pdbPath: outputPdbPath);

引用集合包含Microsoft.NETCore.App和netstandard 2.0.0 ref dll,以及符合netstandard2.0的其他特定dll。

这没有错误。在跑步时我得到:

Unhandled Exception: System.TypeLoadException: Could not load type 'System.Object' from assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

如何为我的编译生成正确的deps.json文件?

1 个答案:

答案 0 :(得分:2)

我们通过以下方式解决了这个问题:

从C:\ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.netcore.app \ 2.0.0 \ ref \ netcoreapp2.0( don)编译C#文件与dll的不要添加对.NET 4的引用。 dll的!):

public static IEnumerable<PortableExecutableReference> CreateNetCoreReferences()
{
  foreach(var dllFile in Directory.GetFiles(@"C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0", "*.dll"))
  {
    yield return MetadataReference.CreateFromFile(dllFile);
  }
}
使用ConsoleApp作为输出

创建CSharpCompilation

CSharpCompilation.Create(assemblyName,
    syntaxTrees: files,
    references: references,
    options: new CSharpCompilationOptions(OutputKind.ConsoleApplication)
  );

现在您只需要在输出旁边放置runtimeconfig.json ([dllname] .runtimeconfig.json),其中包含以下内容:

{
  "runtimeOptions": {
    "tfm": "netcoreapp2.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "2.0.0"
    }
  }
}

可以使用dotnet.exe运行输出。