使用CoreRT /另一个AOT编译.net核心应用程序

时间:2016-10-18 02:03:36

标签: c# compilation .net-core .net-native corert

我正在ASP.NET CORE 1.0上构建REST API。在生产中,IMHO非常有用,不使用JIT,因为带有应用程序的docker容器正在向上和向下扩展,在CI期间反复重新部署,因此每个已部署容器的即时编译会导致可怕的滞后,LB健康检查死亡和其他痛苦。

正如我所读,使用dotnet CLI的本机编译已停止。 我尝试使用CoreRT进行构建但没有运气(由于复杂性而需要详细信息)。

由于这个问题非常抽象,我没有提供示例代码或详细信息,所以一开始几乎没有问题:

  1. 我的推定是否正确 - 将提前编译解决问题,因为每个路径的首次执行速度很慢 - 或者 - 是否还有其他任何解决方案?
  2. 如果是真的,目前可以从.NET Core构建“原生”应用程序(ubuntu x64目标)吗?
  3. 如果是,那么最佳做法是什么 - 我该怎么做?有没有人有这方面的经验?
  4. (目标平台将是ubuntu-14.04-x64 docker镜像以及编译平台。出于开发目的,在OSX上编译它也很不错。)

    提前谢谢。

2 个答案:

答案 0 :(得分:6)

提前完成本机编译目前是不可能的。它是上面链接的CoreRT项目的目标之一,但在我称之为生产准备的任何州都没有。 Connect去年的演示应该是一个非常大的盐。例如,他们仍然没有reflection subsystem。但是,我们有几个解决方案可以大大减少需要在JIT时生成的代码量。对于.NET Core,工具称为CrossGen,而且这些日子已经非常出色。

虽然我引起了你的注意,但我还要提到我们正在研究NGEN / CrossGen格式的演变,这种格式可以减轻典型ni文件所带来的典型痛苦。那就是名称ReadyToRun

希望有所帮助。如果您有其他问题,请告诉我。

披露:我在UWP(CoreRT和LLILC的姐妹项目等)的.NET Native运行时和编译器团队工作

答案 1 :(得分:3)

有一份在https://github.com/dotnet/coreclr/blob/master/Documentation/building/crossgen.md使用CrossGen的指南。它有点过时 - 我会看看我是否可以在某个时候更新它。使用CrossGen最重要的部分是在命令行上指定-Platform_Assemblies_Paths开关,告诉CrossGen所需的所有依赖项的位置(例如,System.Private.CoreLib.dll)。

希望有所帮助。如果您遇到任何进一步的问题,请告诉我。