ASP.NET vNextでは、プロジェクトローダをカスタマイズし、さまざまな言語でサポートできます.

2520 ワード

ASP.NET vNext実行時には、実際にC#ソースコードを実行する前にRosylynコンパイラを使用してコードをコンパイルしてロードします.David Fowlerは、KRuntimeローダの依存注入機能を使用して、選択したプログラミング言語でもvNextをサポートする方法を示しています.
KRuntimeローダーにはASPの作成と実行が含まれている.NET vNextアプリケーションに必要なすべての機能は、設計の原則上、実行時自体が「設計時」という概念を見分けることができず、編集とロード操作が同時に発生します.このため、KRuntimeはプロジェクトから複数の独自のローダを定義する.jsonファイルではすべての依存項目を読み出し、プロジェクト自体のソースコードとともに構築します.
プロジェクトリファレンス(project reference)ローダの動作は非常に興味深いもので、デフォルトではRosylynProjectReferenceProviderが呼び出され、RosylynProjectReferenceオブジェクトが返されます.名前が表示されるように、Rosylyn C#コンパイラを使用してC#ソースコードをコンパイルし、プログラムセットをロードします.
しかし、この動作は上書き可能であり、David Fowlerは対応する方法を実証した.

ASP.NET vNextでのF#のサポート


Davidがgithubで作成したvNextLanguageSupportプロジェクトを見てみましょう.彼はプロジェクトの中でFSharpProjectReferenceProviderクラスを定義し、IProjectReferenceProviderインタフェースを実現しました.このクラスのメソッドはFSharpProjectReferenceオブジェクトを返し、IMetadataProjectReferenceインタフェースを実装します.
FSharpProjectReferenceはEmitメソッドで一連の操作を行いました.
  • 遍歴項目参照
  • すべての参照を一時フォルダにコピーする
  • fscコンパイラを使用してソースコードファイルをコンパイルし、これらの参照を
  • にコンパイルする.
  • 一時ファイルを削除
  • どちらのクラスもFSharpSupportプロジェクトで見つけることができるので、コンパイルしてプログラムセットとして参照できます.特筆すべきは、この2つのクラスの実装はF#をサポートするためであるが、それら自体はC#言語で記述されている.
    Davidはその後、F#プロジェクトの例でこの2つのクラスを使用し、そのためにわざわざproject.jsonファイルにはprojectReferenceProviderTypeプロパティが定義されています.
    (コードクリップ)
    
        "language": {
            "name": "F#",
            "assembly": "FSharpSupport",
            "projectReferenceProviderType": "FSharpSupport.FSharpProjectReferenceProvider"
        },

    これで、あなたのASP.NET vNextアプリでF#をサポートできます.プロジェクトの起動クラスはCクラスではなくF#タイプになりました.
    この例ではF#しか使用していませんが、CLR言語がASPであるように同じ技術を使用することができます.NET vNextは、IMetadataProjectReferenceとIProjectReferenceProviderインタフェースに独自の実装を提供するだけでサポートされています.
    Aleksander Heintzも、Davidの例について、複数の文書でさらに詳細に説明した.
    プロジェクトローダがどのように動作しているか(この文章には時代遅れの内容があることに注意してください.例えば、RosylynAssemblyLoaderというクラスはもう存在しません).
    FSharpReferenceProviderの詳細について.
    C#コードで実装されたFSharpReferenceProviderクラスを使用して、実際のF#インプリメンテーションをロードする方法(F#インプリメンテーションを使用してF#ソースコードをロードする方法).
    この例自体は複雑ではありませんが、KRuntimeが使用する組み込み依存注入の強力な機能を実証し、プロジェクトに新しい特性を追加するために多くの柔軟性を提供します.KRuntime構造について説明したように、実行時の各レイヤは、ネイティブプロセスレイヤ(Native Process)、ホスティングレイヤ(Host)、管理エントリポイントレイヤ(Managed Entry Point)、およびアプリケーションホスティングレイヤ(Application Host)を含み、いずれも依存注入方式によって解析される.(一例として、KRuntimeはMonoによってLinuxおよびOSXオペレーティングシステム上で動作可能である).
    ASP.NET vNextは、マイクロソフトのWebフレームワークの構築と導入における構造的な変更を表しています.
    原文:ASP.NET vNext: Custom Project Loaders and Language Support