web-dev-qa-db-ja.com

CoreRT /別のAOTを使用して.netコアアプリをコンパイルする

ASP.NET CORE1.0でREST APIを構築しています。本番環境では、アプリのDockerコンテナーがスケールアップおよびスケールダウンし、再デプロイされるため、JITを使用しないことは非常に便利です。 CI中に何度も繰り返されるため、デプロイされたすべてのコンテナーのジャストインタイムコンパイルにより、ひどいラグ、LBヘルスチェックの死亡、その他の問題が発生します。

私が読んだように、dotnetCLIを使用したネイティブコンパイルは中止されました。 CoreRT でビルドしてみましたが、運がありませんでした(複雑さのために詳細はオンデマンドで)。

この質問は非常に抽象的であるため、サンプルコードや詳細情報は提供していません。そのため、最初にいくつかの質問があります。

  1. 私の推定は正しいですか-事前コンパイルは各パスの最初の実行が遅いという問題を解決しますか-または-とにかく他の解決策はありませんか?
  2. それが本当なら、現在、.NET Coreから「ネイティブ」アプリ(ubuntu x64ターゲット)を構築することは可能ですか?
  3. もしそうなら、ベストプラクティスは何ですか-どうすればそれを行うことができますか?誰かがそれを経験したことがありますか?

(ターゲットプラットフォームは、ubuntu-14.04-x64 docker imageとコンパイルプラットフォームです。開発目的では、OSXでコンパイルするのも良いでしょう。)

前もって感謝します。

13
rudolfdobias

現時点では、完全なネイティブを事前にコンパイルすることはできません。これは、上記でリンクされたCoreRTプロジェクトの目標の1つですが、本番環境に対応しているとは言えません。昨年のコネクトでのデモは、かなり大きな塩で行う必要があります。たとえば、まだ リフレクションサブシステム がありません。ただし、JIT時に生成する必要のあるコードの量を大幅に削減できるソリューションがいくつかあります。 .NET Coreの場合、ツールは CrossGen と呼ばれ、最近はかなり焼き付けられています。

私はあなたの注意を引いていますが、私たちは典型的なniファイルに伴う典型的な苦痛の大きな塊を軽減するNGEN/CrossGenフォーマットの進化に取り組んでいることにも言及します。それはその時の名前の下にあります ReadyToRun

お役に立てば幸いです。他にご不明な点がございましたら、お気軽にお問い合わせください。

開示:私はUWP(CoreRTやLLILCなどの姉妹プロジェクト)の.NETネイティブランタイムおよびコンパイラチームで働いています。

6

CrossGenを使用するためのガイドが https://github.com/dotnet/coreclr/blob/master/Documentation/building/crossgen.md にあります。少し古くなっています。いつか更新できるかどうかを確認します。 CrossGenを使用する上で最も重要な部分は、コマンドラインで-Platform_Assemblies_Pathsスイッチを指定して、必要なすべての依存関係(System.Private.CoreLib.dllなど)の場所をCrossGenに通知することです。

お役に立てば幸いです。さらに問題が発生した場合はお知らせください。

3
John Chen