テキストはボリュームがあり、次の目的で設計されています。
- .NET Coreプラットフォームに精通したばかりの初心者開発者。
- 実稼働環境でDevOpsエンジニアとして活動する経験豊富な開発者。
この記事では、SDK(dotnet CLI)を使用してアプリケーションを作成するプロセスについては触れませんが、このライブラリはマネージアセンブリであるため、この情報はSDKの動作を理解するのに役立ちます。 .NET Coreで実行されます。
実行プロセスの例はWindowsで説明されていますが、他のOSでも同じ原理で動作します(実行可能ファイルとネイティブライブラリのさまざまな拡張を考慮に入れて)。
0.ペイフォープレイ
すべての.NET開発者は、クレードルから知っています。.NETアプリケーションを実行するには、.NET Frameworkをターゲットコンピューター、つまりCLR + BCLにインストールする必要があります。
BCLはGACにあり、そこからアプリケーションが必要な依存関係をダウンロードします。
.NET Coreアーキテクチャは一般的には同じように見えます:.NET Core = Core CLR + Core FX(BCLの新しい名前)、これらのコンポーネントの解決方法、およびランタイム(CLR)のロード方法が異なります。 .NET Coreの.NET FrameworkのマネージアセンブリMyApp.exeのヘッダーの代わりに、MyApp.exe自体がネイティブのコアCLRブートプログラムです。
.NET Coreでは、コンパイル段階で定義するすべてのプログラムコンポーネントはアプリケーションの依存関係(Core CLR、JITを含む)であり、.NET Coreインフラストラクチャはパッケージとして扱います。 このようなパッケージはassetと呼ばれ、NuGetパッケージまたは通常のファイルのいずれかです。
NuGetを介して出荷されるコンポーネントの例:
- Microsoft.NETCore.Runtime.CoreCLR-コアCLR。
- Microsoft.NETCore.JitはJITコンパイラです。
- System.Private.CoreLib-基本型System.Object、System.Int32、System.String(mscorlib.dllに類似)。
- System.Console-コンソールへのアクセス。
アプリケーションを起動するときのアンパック形式のこれらの依存関係は、特定のディレクトリ(.NET Coreフレームワークフォルダー-Core FX、アプリケーションフォルダー、または任意のNuGetキャッシュ)のいずれかになければなりません。
このモデルのおかげで、.NET Coreアプリケーションは恐ろしく多数の小さなモジュールで構成されていますが、これは不要な依存関係の量を減らすために行われます。
このアプローチは、ペイフォープレイと呼ばれます。 つまり、アプリケーションは必要な機能のみをロードしますが、そのような各機能は個別のアセンブリに含まれています。
1. FDD対SCD
.NET Coreアプリケーションには2種類の展開があります 。
- ポータブル(フレームワーク依存の展開-FDD)
- スタンドアロン(自己完結型展開-SCD)
ポータブル(FDD)アプリケーションは、従来の.NET Frameworkアプリケーションに似ています。 この場合、.NET Coreフレームワークの特定のバージョン(共有フレームワーク、.NET Coreランタイム、再配布という用語も使用されます)をターゲットコンピューターに配置する必要があり、起動時に、ホストプロセスはフレームワークフォルダーからCore CLR、Core FXを読み込みます。
スタンドアロン(SCD)アプリケーションでは、実行用のすべてのコンポーネント(CoreCLR、CoreFX)、およびサードパーティのライブラリ、つまり絶対的にすべての依存関係が、アプリケーション自体(ほとんどの場合1つのフォルダー)と共に配信されます。
スタンドアロンアプリケーションは特定のOSおよびアーキテクチャ(Windows 7 x64またはOSX 10.12 x64など)に関連付けられていることを理解することが重要です。 このような識別子は、 ランタイム識別子(RID)と呼ばれます。 各OS /アーキテクチャには独自のバージョンのCore CLRライブラリ(およびその他のネイティブコンポーネント)があるため、スタンドアロンアプリケーションの場合、コンパイル段階で、RuntimeIdentifierプロパティでターゲットシステム(RID)のパラメーターを指定する必要があります。
このようなアプリケーションは、.NET Coreがインストールされているかどうかに関係なく、特定のOS /アーキテクチャを持つコンピューターで動作します。
2. .NET Coreランタイム(共有フレームワーク)
ポータブルアプリケーションを実行するには、少なくとも1つの.NET Core Runtime (共有フレームワーク)をターゲットマシンにインストールする必要があります。
.NET Core RuntimeはC:\ Program Files \ dotnetフォルダーにインストールされます 。
フレームワークのファイルは、 C:\ Program Files \ dotnet \ sharedフォルダーに保存されます。
.NET Core Runtimeの主要コンポーネント:
- .NET Coreアプリケーションを実行するための「ユーティリティ」dotnet.exe。 これはmuxerと呼ばれ、.NET Coreインフラストラクチャのメインドライバーです。 このプログラムは、アプリケーションを起動して開発コマンドを実行するための「エントリポイント」として機能します。 .NET Core SDKがインストールされている場合、つまり、すべてのアプリケーションのホストプロセス-corehostです。
- ランタイムコンポーネント(CoreCLR、CoreFXなど)は、フレームワークCの別のフォルダーにインストールされます:\ Program Files \ dotnet \ shared \ [Framework name] \ [Framework version]。
- ホストフレームワークリゾルバー-フォルダーにあるネイティブライブラリ
C:\ Program Files \ dotnet \ host \ [バージョン] \ hostfxr.dll。 アプリケーションが起動すると、このライブラリの最大バージョンが、アプリケーションの後続の実行のためにフレームワークバージョンを解決します。
.NET Core Runtimeのインストール時のファイル構造 。
フレームワークのいくつかのバージョンをインストールできます。
ポータブルアプリケーションを実行するには、dotnet.exeホストプロセスを開始し、マネージアセンブリへのパスを引数として渡す必要があります。
「C:\ Program Files \ dotnet」がPATH環境変数の値に追加されるため、ポータブルアプリケーションをコマンドラインから起動できるようになりました。
> dotnet path/to/App.dll
アプリケーションフォルダー([AppName] .dllがある場所)には、ファイル[AppName] .runtimeconfig.jsonが含まれている必要があります。 ポータブルアプリケーションの実行に使用するフレームワークの名前とバージョンを示します。 例:
MyApp.runtimeconfig.json
{ "runtimeOptions": { "framework": { "name": "Microsoft.NETCore.App", "version": "2.0.0" } } }
このファイルは、ポータブルアプリケーションに必要です。
上記の構成では、ランタイムコンポーネントはC:\ Program Files \ dotnet \ shared \ Microsoft.NETCore.App \ 2.0.0フォルダーから読み込まれます。
3.ポータブル(FDD).NETコアアプリケーション構造
Portable .NET Coreアプリケーションは、次の必須ファイルで構成されています。
- [AppName] .dll-アプリケーションILコード、エントリポイント。
- [アプリの依存関係] *。Dll-CoreFXの一部ではないすべてのアプリケーションの依存関係(プロジェクトビルド、サードパーティライブラリ、FCL)。
- [AppName] .runtimeconfig.json-ランタイム構成 。ここに.NET Coreフレームワーク(ランタイムコンポーネント)の名前とバージョンがあります。 ファイルは、.NET FrameoworkのMyApp.exe.configのようなものです。 特定のフレームワークを明示的に指定する必要がある場合は、この構成を変更できます。
- [AppName] .deps.json-すべてのアプリケーションの依存関係のリスト。 このファイルはコンパイル時に生成されるため、変更することはお勧めしません。 ファイルはオプションですが、ファイルを削除すると、起動時のホストプロセスはすべての依存ファイルのパスをチェックできなくなり、実行はユーザーの責任で開始されます。
ドキュメンテーション
.NET Coreプラットフォームの異なるバージョン用の同じポータブルアプリケーションのアーティファクト:
ファイル数の減少は、多くのライブラリがCore FX 1.0に存在しなかったため、通常の依存関係としてアプリケーションの一部として使用されたためです。 Core FX 2.0では、これらのアセンブリが追加されたため、アプリケーションには付属しなくなりましたが、フレームワークフォルダーから取得されます。
4.スタンドアロン(SCD).NETコアアプリケーション構造
ポータブル(FDD)アプリケーションと同じですが、すべてのランタイムコンポーネント(CoreCLR、CoreFX)と、独自のdotnet.exe マルチプレクサーが追加され、[AppName] .exeに名前が変更されました。 バージョン2.0までの.NET Coreの場合、スタンドアロンアプリケーションを起動するためのマルチプレクサーは、C:\ Program Files \ dotnet.exe(同じファイル、名前のみ変更)と同じです。 .NET Core 2.0の場合、Microsoft.NETCore.DotNetAppHost NuGetパッケージのマルチプレクサーが使用されます。 パッケージにはapphost.exeファイルが1つ含まれており、コンパイル時にアセンブリ名(MyApp.dll)に「縫い付け」られ、ファイル自体の名前がMyApp.exeに変更されます。 スタンドアロンアプリケーションが起動すると、実行可能ファイル(MyApp.exe)と実行可能なアセンブリの名前(MyApp.dll)の「バインド」がチェックされます。
異なるバージョンの.NET Coreプラットフォーム用の同じスタンドアロンアプリケーションのコンテンツ:
ポータブルアプリケーションとは逆の画像が観察されます-Core FXが増えるほど、アプリケーションに付属するファイルが増えます。
展開タイプの考慮事項
- このタイプはサイズがはるかに小さく、多数の依存関係を持つ大規模なアプリケーションを起動する場合により安定しているため、常にポータブルデプロイメントを優先してください。 さらに、ポータブルアプリケーションはRIDに依存しないため、構成が簡単です。
- .NET Core Runtimeをインストールできない場合、またはアプリケーションの起動時間が重要な場合は、スタンドアロンを選択してください。 スタンドアロンバージョンでは、[AppName] .deps.json構成ファイルを削除することで、起動時に1〜2秒勝つことができます(そうすると、すべての依存関係ファイルがあることに注意してください)。
5.ランタイム構成ファイル
ファイル[AppName] .runtimeconfig.jsonおよび[AppName] .deps.jsonはランタイム構成ファイルと呼ばれます (* .deps.jsonは依存関係マニフェストファイルと呼ばれます)。 これらはコンパイルプロセス中に作成され、dotnet.exeを実行してアプリケーションを実行するために必要なすべての情報が含まれています。
[AppName] .runtimeconfig.jsonでは、 .NET Coreランタイムの名前とバージョンが設定され(フレームワークの検索時にパッチバージョン( SemVer )が考慮されるかどうかも示されます)、Core CLRの操作パラメーター(ガベージコレクターの操作モード)も設定されます。 このファイルは、ポータブルに必要であり、スタンドアロンアプリケーションには必要ありません。
dotnet.exe([AppName] .exe)は、 [AppName] .deps.jsonファイルを使用して、起動時にすべてのアプリケーションの依存関係の絶対パスを決定します。
構造[AppName] .deps.json :
- 対象セクション
ターゲットという用語は、アプリケーションを実行するターゲットプラットフォーム(名前とバージョン)です(例:.NET Framework 4.6.2、.NET Core App 1.1、Xamarin.Mac 1.0、.NET Standard 1.6)。 この構成は、 NuGetターゲットフレームワークに似ています。
ターゲットセクションは、プラットフォームとその依存ツリーを次の形式で定義します
[依存関係のID(パッケージ)] / [バージョン]:{
依存関係:{このパッケージの依存関係(パッケージ)のリスト}、
このパッケージの管理ファイルとネイティブファイルへの相対パス
}
アプリケーションを実行するには、ターゲットにRIDが必ず含まれている必要があります(例: .NETCoreApp、Version = v1.1 / win10-x64) 。 スタンドアロンアプリケーションのdeps.jsonファイルは常に1つで、ターゲットプラットフォームのRIDが含まれています。 ポータブルアプリケーションの場合、deps.jsonファイルは2つあります。1つはフレームワークフォルダーにあり、2つ目はアプリケーションフォルダーにあります。 ポータブルアプリケーションのRIDは、フレームワークフォルダーの[FrameworkName] .deps.jsonファイルで指定されます。 dotnet.exeは、アプリケーションを実行するためのフレームワークを定義した後、まずこのフレームワークのdepsファイルをロードします(たとえば、 C:\ Program Files \ dotnet \ shared \ Microsoft.NETCore.App \ 2.0.0 \ Microsoft.NETCore.App。 deps )、次にアプリケーションのdepsファイル。 アプリケーションdepsファイルの優先度が高くなります。
deps.jsonスタンドアロンアプリケーションファイルの内容を詳しく見てみましょう。
SampleApp.deps.json"targets": { ".NETCoreApp,Version=v1.1/win7-x64": { ... "libuv/1.9.1": { "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" }, "native": { "runtimes/win7-x64/native/libuv.dll": {} } }, ... "system.data.sqlclient/4.3.0": { "dependencies": { "System.Data.Common": "4.3.0", "System.IO.Pipes": "4.3.0", "System.Text.Encoding.CodePages": "4.3.0", "runtime.native.System.Data.SqlClient.sni": "4.3.0" }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Data.SqlClient.dll": { "rid": "unix", "assetType": "runtime" }, "runtimes/win/lib/netstandard1.3/System.Data.SqlClient.dll": { "rid": "win", "assetType": "runtime" } } }, ... "runtime.win7-x64.microsoft.netcore.runtime.coreclr/1.1.1": { "runtime": { "runtimes/win7-x64/lib/netstandard1.0/SOS.NETCore.dll": {}, "runtimes/win7-x64/lib/netstandard1.0/System.Private.CoreLib.dll": {}, "runtimes/win7-x64/lib/netstandard1.0/mscorlib.dll": {} }, "native": { "runtimes/win7-x64/native/System.Private.CoreLib.ni.dll": {}, "runtimes/win7-x64/native/clretwrc.dll": {}, "runtimes/win7-x64/native/coreclr.dll": {}, "runtimes/win7-x64/native/dbgshim.dll": {}, "runtimes/win7-x64/native/mscordaccore.dll": {}, "runtimes/win7-x64/native/mscordbi.dll": {}, "runtimes/win7-x64/native/mscorlib.ni.dll": {}, "runtimes/win7-x64/native/mscorrc.debug.dll": {}, "runtimes/win7-x64/native/mscorrc.dll": {}, "runtimes/win7-x64/native/sos.dll": {} } }
依存関係プロパティは、特定のパッケージの依存関係(パッケージ)をリストします。
runtimeTargetsプロパティは 、ポータブルアプリケーションのdepsファイルで使用され、特定のRIDのライブラリファイルパスを決定します。 このようなRID固有のライブラリは、 RuntimesフォルダーのPortableアプリケーションに付属しています 。
ランタイムプロパティとネイティブプロパティには、それぞれ管理ライブラリとネイティブライブラリの相対パスが含まれています。 resourcesプロパティには、ローカライズされたリソースアセンブリの相対パスとロケールが含まれています。
パスは、depsファイルではなく、NuGetパッケージキャッシュに相対的です。
--additional-deps引数またはDOTNET_ADDITIONAL_DEPS環境変数の値を渡すことにより、サードパーティのdepsファイルを追加できます 。
この機能は、ポータブルアプリケーションでのみ使用できます。
引数値には、depsファイルへの絶対パスと、共有depsファイルが置かれているディレクトリへのパスを含めることができます。 このディレクトリ内で、depsファイルは\ shared \ [FX name] \ [FX version] \ *。Deps構造に配置する必要があります。 たとえば、 shared \ Microsoft.NETCore.App \ 2.0.3 \ MyAdditional.deps.jsonです。
このアプローチは、Visual Studioで使用され、ファイルを介して暗黙的にApplication Insightsをプロジェクトに追加します。
C:\ Program Files \ dotnet \ additionalDeps \ Microsoft.AspNetCore.ApplicationInsights.HostingStartup \
共有\ Microsoft.NETCore.App \ 2.0.3 \ Microsoft.AspNetCore.ApplicationInsights.HostingStartup.deps.json
dotnet.exe(MyApp.exe)がアプリケーションの依存パスを定義すると、ランタイムおよびネイティブパスのリストが個々のライブラリごとにコンパイルされます。
特定のRIDのruntimeTargetsにライブラリがある場合、指定されたassetTypeに基づいてランタイムまたはネイティブリストに追加されます。
- RuntimeTargetセクション
実行するターゲットプラットフォームの名前とバージョンが含まれます。 対象セクションには、実際にはコンパイル(RIDなし)および実行(RIDで必要)の2つの要素が含まれます。 runtimeTargetセクションは便宜上使用され、dotnet.exeがターゲットセクションの処理に時間を浪費しないように、ターゲットセクションの値を複製します。 既に述べたように、スタンドアロンアプリケーションの場合、ターゲットOSのRIDはアプリケーションdepsファイルに含まれ、ポータブルの場合はフレームワークdepsファイルに含まれます。
- 図書館セクション
すべてのアプリケーションの依存関係のリストを(パッケージID /バージョンの形式で{metadata}で)定義し、それぞれのメタデータを含みます。 メタデータは以下を示します。
- 依存関係のタイプ(プロジェクト、パッケージ、参照)、
- サービス可能(パッケージタイプのみ)-パッケージがサービス可能かどうかのインジケーター(パッケージアセンブリを外部サービス、Windows Updateまたは.NET Core Servicing Indexでパッチ(置換)できるかどうかを決定します)。
- パッケージハッシュ(パッケージの依存関係用)
- その他のデータ
6. Portable .NET Coreアプリケーションを起動するプロセス
ターゲットコンピューターには、起動するアプリケーションの構成と一致する.NET Core Runtimeがインストールされている必要があります。
6.1。 アプリケーションの起動
コマンドラインからマルチプレクサー(muxer)を使用して実行(すべてのOSで同じ)。
> dotnet path\to\MyApp.dll
dotnet.exe-名前がcorehost.exeに変更されました 。このプログラムは.NET Coreアプリケーションのホストプロセスであり、そこから開始プロセスが開始されます。
6.2。 [corehost] Framework Resolver(hostfxr.dll)の検索とダウンロード
この時点で、dotnet.exeは[own directory] / host / fxr / folderに移動します 。 ポータブルアプリケーションの場合、このライブラリは共有フォルダーC:\ Program Files \ dotnet \ host \ fxr \ [FXR version] \ hostfxr.dllにあります。 複数のバージョンがある場合、dotnet.exeは常に後者を使用します。
hostfxr.dll (Framework Resolver)を読み込んだ後、起動プロセスはこのライブラリのスコープに入ります。
6.3。 [hostfxr]ランタイムの決定(スタンドアロン、マルチプレクサ、スプリット/ FX)
hostfxrの最初のタスクは、ホストプロセスが動作するモードを決定することです。したがって、アプリケーションのタイプ(ポータブル(FDD)またはスタンドアロン(SCD))を決定します。 ポータブル(FDD)モードでは、実行中のアプリケーションかSDKコマンドかを判別します。
実行のタイプ(プログラムまたはSDKコマンド)の決定は次のとおりです。
-引数の中に値が.dllまたは.exeで終わる引数がある場合-起動プロセスは、指定されたファイルの実行モードで続行します。 そのような引数がない場合、制御はSDKに転送されます。 これを行うには、dotnet.dll(ポータブルアプリケーションとして)が[own directory] \ sdk \ [version]フォルダー(存在する場合)から起動され、プロセスの現在のホストの引数がこのアセンブリに渡されます。
また、ポータブル(FDD)アプリケーションの場合、hostfxrは、コンポーネントが実行のためにロードされるフレームワーク(.NET Core Runtime)を定義します。
検証アルゴリズムは非常に単純です-[AppName] .exeマルチプレクサー(この場合はdotnet.exe)が起動されたフォルダーにcoreclr.dllまたは[AppName] .dllがない場合、ポータブルアプリケーション。 これらの2つのファイルのいずれかが存在する場合、次に検証が行われます-ポータブル(分割/ FX)アプリケーションまたはスタンドアロン。 [AppName] .dllが存在する場合はスタンドアロン、そうでない場合はポータブル(分割/ FX)。
スプリット/ FXモードはxunitの起動に使用され、アプリケーションが独自のhostfxr.dllでポータブルとして起動することを意味します。 このモードは.NET Core 2.0では使用されません。
ポータブルアプリケーションは、いわゆるExecモードで起動することもできます 。
これを行うには、開始コマンドに最初の引数として exec C:\> dotnet exec ...を含める必要があります。
このモードで起動すると、構成ファイルへのパスを明示的に指定できます。
--depsfile <PTH>
--runtimeconfig <PTH>
これは、アプリケーションフォルダー内のファイルの代わりに使用されます。
6.4。 [hostfxr] .NET Coreランタイムの定義
Hostfxrは、まずdepsおよびruntimeconfig構成ファイルを検出してロードします。 引数で何もオーバーライドされていない場合、これらのファイルはアプリケーションフォルダーから取得されます。
現在の段階で、hostfxrは( 構成ファイルに従って )アプリケーションがポータブルかスタンドアロンかを判別します。
構成ファイルを読み込んでモードを決定した後、hostfxr はフレームワークフォルダー (.NET Core Runtime)を定義します 。
これを行うには、hostfxrはまず共有フォルダーにインストールされているバージョンを判断し、[AppName] .runtimeconfig.jsonの値を考慮して 、このリストからリリースバージョンを選択します 。
バージョンを選択するとき、 「候補Fxなしでロールフォワード」パラメータが考慮されます。これは、指定されたバージョンとマシンで使用可能なバージョンのコンプライアンスの重大度を示します。
6.5。 [hostfxr] hostpolicy.dllの検索とダウンロード
現在の段階では、すべてがランタイムコンポーネントのパスを決定する準備ができています。 ホストライブラリと呼ばれるhostpolicy.dllライブラリは、このタスクに関係しています。
hostpolicy.dllの検索プロセスは、さまざまな場所の順次チェックで構成されています。 ただし、最初に、hostpolicyのバージョンはフレームワークのdepsファイルから決定されます(例:C:\ Program Files \ dotnet \ shared \ Microsoft.NETCore.App \ 2.0.0 \ Microsoft.NETCore.App.deps )。 このファイルでは、 Microsoft.NETCore.DotNetHostPolicyという名前のパッケージが見つかり、そのバージョンが取得されます。
次に、.NET Core Servicingフォルダー( Windowsの場合 -フォルダーC:\ Program Files [(x86)] \ coreservicing \ pkgs )。 そのようなファイルが見つかった場合、将来使用するためにダウンロードされます。
前の手順でファイルが見つからなかった場合、hostpolicy.dllはフレームワークフォルダーにあります。
hostpolicy.dllが定義されると、hostfxrはこのライブラリをロードし、 制御を転送します 。
6.6。 [hostpolicy]依存関係リストの定義
hostpolicy.dllライブラリは 、すべてのアプリケーション依存関係の絶対パスを決定する役割を果たします。
まず、hostpolicy は Dependencies Resolverと呼ばれるコンポーネントを作成します。このコンポーネントは、フレームワークファイルとアプリケーションファイルの2つのdepsファイルをダウンロードします。
最初に、リストがフレームワークのdepsファイルからロードされ、CoreCLRやCoreFXライブラリなどの依存関係が定義されます。 次に、アプリケーションのdepsファイルからのリストは、アプリケーションのアセンブリとその依存関係を示します。
各依存ファイルについて、Dependency Resolver は指定されたruntimeTargetのすべての依存関係をリストします 。
各パッケージについて、runtimeTargets(RID固有の依存関係)のすべてのセクションからのファイルのリストが最初にコンパイルされ、次にネイティブおよびランタイムのセクションからのすべてのファイルのリストがコンパイルされます。 条件付き形式のすべての依存関係の相対パスのこのような組み合わせリスト
パッケージID-RID-資産タイプ(ランタイム、ネイティブ)-ファイルパスはターゲット資産と呼ばれます。
依存関係ファイルのこれら2つのリスト(RIDおよび非RID)がコンパイルされた後、 ターゲットとライブラリの調整と呼ばれるプロセスが実行されます。 これは、ライブラリセクションの各パッケージについて、通常のファイルでオーバーライドされる必要があるRID固有のファイルがあるかどうかがチェックされるという事実から成ります。
6.7。 [hostpolicy] TPA、コアCLR、およびCLR Jitパスの定義
次に、依存関係リゾルバーは、マネージアセンブリファイルの絶対パス(アプリケーションの依存関係)を一覧表示します。 このリストはTPA(Trusted Platform Assemblies)と呼ばれ、AppDomainを構成するためにコアCLRに渡されます。 依存関係ファイルの残りの場所(coreclr、corejitを除く)のディレクトリの絶対パスのリストもコンパイルされます。
マネージアセンブリの絶対パスは、プローブパスでファイルを検索することで決定されます。 デフォルトでは、フレームワークフォルダーとアプリケーションフォルダーの2つがあり、それらはdepsファイルの場所に基づいています。 パスを追加することもできます。
1)引数--additionalprobingpathを渡す
--additionalprobingpath %UserProfile%\\.nuget\\packages
2)ファイル[AppName] .runtimeconfig.jsonで指定します(優先度は引数の優先度よりも低い)、たとえば
{ "runtimeOptions": { "additionalProbingPaths": [ "C:\\Users\\username\\.nuget\\packages" ] } }
ファイルの存在は、フレームワークとアプリケーションフォルダーで確認されます(対応するdepsファイルで指定されている場合)。これらのディレクトリはNuGetパッケージのキャッシュと見なされるため、パスに関する他のディレクトリの相対パスは考慮されません。
検索順序:
- アプリケーションフォルダ
- フレームワークフォルダー
- プローブパス
アプリケーションdepsファイルが欠落している場合、アプリケーションフォルダーの拡張子が.ni.dll、.dll、.ni.exe、.exeのすべてのファイルがTPAに入ります。
TPAリストをコンパイルした後、CoreCLRおよびCLRJitパスが決定されます。
アプリケーションdepsファイルがない場合、dotnet.exeは最初に[app directory] \ lib \でこれらのライブラリを見つけようとします。 通常の実行では、パスはフレームワークフォルダーから取得されます(相対パスを破棄し、ファイル名のみを取得します)。
次のCoreCLR設定が設定されます。
- TRUSTED_PLATFORM_ASSEMBLIES-すべての管理対象アプリケーションライブラリの絶対パスのリスト。
- NATIVE_DLL_SEARCH_DIRECTORIES-ネイティブの依存関係が見つかったディレクトリの絶対パス。
- PLATFORM_RESOURCE_ROOTS-リソースの依存関係が見つかったディレクトリの絶対パス
- AppDomainCompatSwitch-定数「UseLatestBehaviorWhenTFMNotSpecified」。
- APP_CONTEXT_BASE_DIRECTORY-アプリケーションフォルダー。
- APP_CONTEXT_DEPS_FILES-アプリケーションとフレームワークのdepsファイルの絶対パス。
- FX_DEPS_FILE-フレームワークdepsファイルの絶対パス。
- PROBING_DIRECTORIES-追加のセンシングパス(指定されている場合)。
次に、制御はcoreclr.dllに渡されます。
7. Startalone(SCD).NET Coreアプリケーションの起動プロセス
スタンドアロンアプリケーションを起動するプロセスは、初期段階と、デフォルトでアプリケーションフォルダに配置する必要があるコンポーネントの場所のみがポータブルと異なります。
7.1。 アプリケーションの起動
ネイティブマルチプレクサーMyApp.exeを実行して実行されます。 .NET Core <2.0では、このマルチプレクサは名前が変更された汎用dotnet.exeマルチプレクサです。 .NET Core 2.0以降では、別個のapphost.exeマルチプレクサー(dotnet.exeのわずかに変更されたバージョン)が使用されます。
このファイル(apphost.exe)は、Microsoft.NETCore.DotNetAppHostパッケージのNuGetを介して配信されます。
ファイルにはテキストプレースホルダーが含まれています(その値は、foobar文字列のSHA-256ハッシュです)。
dotnet build SDK コマンドが実行されると、プレースホルダーの値が起動されているアセンブリの名前(MyApp.dllなど)に変更され、apphost.exeの名前がMyApp.exeに変更されます。 したがって、実行可能ファイルはアセンブリにリンクされます。 .NET Core> = 2.0アプリケーションを実行すると、この「バインディング」が最初にチェックされます。
7.2。 起動プロセス
ポータブルアプリケーションの場合と同じですが、depsファイルが1つしかなく、すべての依存関係がアプリケーションフォルダーまたは指定された--additionalprobepathsで検索される点が異なります。
8.要約する
- コンポーネントモデル.NET Core(Runtime、BCL)は、完全にNuGetパッケージで構成されています。
- 展開には、FDDとSCDの2つのタイプがあります。 プラットフォーム固有のコンポーネントの複雑さを回避し、不要な依存関係を提供しないために、可能な限り、フレームワーク依存デプロイメントを使用することをお勧めします。
- ご覧のとおり、ターゲットマシンの起動プロセスに影響を与え、必要に応じて依存関係ファイルを上書き/修正したり、暗黙的な(動的に起動された)依存関係を追加したりする可能性があります。
- Dependency manifest (*.deps.json) .
- --additional-deps --additionalprobepaths runtime- .
- Exec mode .
- Trace- , COREHOST_TRACE=1