MS_DotNetCrossPlatform - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- 戻る(.NET開発、移行・マイグレーション > 各種、技術毎の移行性)
- .NETのクロスプラットフォーム対応
- .NET Core / .NET Standard / Mono
-
以前は、PCLのレベルのクロスプラットフォーム対応しか無かったが、
.NET Coreの登場により、状況は大きく変わった。 -
マイクロソフトは、あらゆる環境に対応する開発ツール群を提供しようとしている。
- Any Developer(どんな開発者にも)
- Any App(どんなアプリケーションにも)
- Any Platform(どんなプラットフォームにも)
この中の、Any Platform に対応するのが、.NET Core。
とりあえず雰囲気を掴むための最新の図。

- 元データ(Excel): MS_DotNetCrossPlatform_XNET.xlsx
-
【特別企画】Windowsにこだわらない、サティア・ナデラのMicrosoft - クラウド Watch
https://cloud.watch.impress.co.jp/docs/special/678748.html-
.NET はマルチプラットフォーム化される
こういった変化に対応し、さらに Microsoft 独自のテクノロジーを
生かしていくためには、.NET Framework をスタンダードにして、
マルチプラットフォームで動作できるようにしていく必要があるのだと思われる。
-
-
「好みのデバイスで好みの開発言語を」--新しいVisual Studioの世界 - ZDNet Japan
https://japan.zdnet.com/article/35092575/.NET スタンダードライブラリを構築して、.NET エコシステムの拡大を目指す。
色々用語が出てくるので纏める。
- 共通言語基盤(CLI : Common Language Infrastructure)
-
.NET Frameworkの基幹を構成する仕様
(ECMA-335 および ISO/IEC 23271) - CLI は、言語やプラットフォームに依存しない環境を定義しており、
様々な言語で書いたソースコードを他のプラットフォームでも使える。
移行メモ(紛らわしい略語): .NET の文脈で CLI は 2 つある。
略語 意味 CLI Common Language Infrastructure(本節の意味。ECMA-335) CLI Command Line Interface( dotnetコマンドの意味。.NET CLI)現在の文書で「.NET CLI」と書かれていれば、ほぼ後者(
dotnetコマンド)である。
-
共通型システム
- CTS : Common Type System
- プログラミング言語間で共通して用いられる型の集合
-
メタデータ
- プログラムの構造に関する情報。
- プログラミング言語上やツールなどから参照できる。
-
共通言語仕様
- CLS : Common Language Specification
- 相互運用性のためのプログラミング言語に対する規定
-
仮想実行システム
- VES : Virtual Execution System
- CLI に適合したプログラムの読込と実行。
- メタデータを活用して動的に機械語を生成する。
移行メモ(正誤): 元ページは VES を
「Virtual Execution Evnironment」としていたが、
ECMA-335 の正しい語は Virtual Execution System である。
-
共通言語基盤 - Wikipedia
https://ja.wikipedia.org/wiki/%E5%85%B1%E9%80%9A%E8%A8%80%E8%AA%9E%E5%9F%BA%E7%9B%A4 -
ECMA-335: Common Language Infrastructure (CLI)
https://ecma-international.org/publications-and-standards/standards/ecma-335/
皆さんご存知の .NET Framework。
- BCL : Base Class Library(基本クラスライブラリ)
- 全ての CLI 言語から利用可能な共通言語基盤 (CLI) 標準ライブラリ
- FCL : Framework Class Library
- .NET Framework の BCL の意味で使用される、BCL のスーパーセット
- CLI で定義されている標準ライブラリの .NET Framework 実装
- マイクロソフト固有の名前空間を含む
- PCL : Portable Class Library
- PCL の後継は.NET Standard。
- Microsoft プラットフォーム間でコードを共有できる
クロスプラットフォーム アプリ・ライブラリを開発可能。
補足(PCL がなぜ廃れたか): PCL は
「対象プラットフォームの**共通部分(積集合)**だけを使う」という方式だった。
対象を増やすほど使える API が減るという構造的な弱点があり、
プロファイルの組み合わせ爆発(Profile7、Profile111 …)も起きた。.NET Standardはこれを逆転し、
「バージョン番号で API セットを定め、各実装がそれを満たす」
という方式にした。PCL は現在では非推奨である。
Target Framework Monikers (TFMs)
.NET Core : netcoreapp
- Console アプリケーション : .NET Core
- デスクトップ・アプリケーション : UWP
- Web アプリケーション : ASP.NET Core
Mono : mono or xamarin
- monoandroid
- monotouch
- monomac
- xamarinios
- xamarinmac
※ Xamarin
.NET Standard : netstandard
.NET 実装の動作の統一性を確立、
クロスプラットフォーム対応を推進する。
.NET 5 : net5.0
補足(最新化:TFM は統合された): .NET 5 以降、
TFM は次のように整理され、netcoreapp/xamarin系は使われなくなった。
TFM 意味 net8.0プラットフォーム非依存(Windows / Linux / macOS で動く) net8.0-windowsWindows 専用 API を使う(Windows Forms / WPF / COM) net8.0-android/net8.0-ios/net8.0-maccatalyst.NET MAUI 等 netstandard2.0.NET Frameworkとも共有したいライブラリ向け(現役) つまり「.NET Core / Mono / .NET Framework という
3 系統をどう繋ぐか」という本ページの問題意識は、
.NET 5 でランタイムが 1 本化されたことでほぼ解消した。
.NET Standardの役割も、
「.NET Framework を切れないライブラリ」に限定されつつある。
補足(GUI だけは統合されなかった): ランタイムが 1 本化された後も、
GUI のクロスプラットフォーム化は未解決のままである。
選択肢 対象 Windows Forms / WPF Windows のみ .NET MAUI Android / iOS / macOS / Windows(Linux 非対応) Uno Platform 上記 + Linux + WebAssembly Avalonia UI Windows / Linux / macOS + モバイル + WebAssembly(OSS で実績が増えている) Blazor ブラウザ(+ Hybrid でデスクトップ) Linux デスクトップまで含めたい場合、
Microsoft 純正には答えがなく、Avalonia / Uno という
サードパーティ製を選ぶことになる点は押さえておきたい。
Roslyn ベースのアナライザー
- 参考
- Roslyn ベースのアナライザー - .NET | Microsoft Learn
https://learn.microsoft.com/dotnet/standard/analyzers/
- Roslyn ベースのアナライザー - .NET | Microsoft Learn
-
C# API の互換性リスクの可能性および非推奨の API の呼び出しを検出する
-
参考
- .NET API アナライザー | Microsoft Learn
https://learn.microsoft.com/dotnet/standard/analyzers/api-analyzer
- .NET API アナライザー | Microsoft Learn
-
以下のケースで役立つ
- ライブラリでマルチプラットフォームをサポートしたい場合や、
- アプリケーションで他の TFM との互換性を確保する作業を知りたい場合
-
参考
- .NET Portability Analyzer - .NET | Microsoft Learn
https://learn.microsoft.com/dotnet/standard/analyzers/portability-analyzer
- .NET Portability Analyzer - .NET | Microsoft Learn
補足(現在の推奨ツール): .NET Portability Analyzer は
アーカイブされ、後継は .NET Upgrade Assistant となっている。dotnet tool install -g upgrade-assistant upgrade-assistant upgrade <プロジェクト>
try-convert(プロジェクト形式の SDK スタイル化)も内包しており、
現在の移行作業ではこちらが起点になる。
-
何故か、AWS がリリース。
-
機械学習を使用しているらしい。
-
参考
- Porting Assistant for .NET を発表 | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/announcing-the-porting-assistant-for-net/
- Porting Assistant for .NET を発表 | Amazon Web Services ブログ
補足(AWS が出した理由): 「何故か」と書かれているが、動機は明確である。
.NET Framework アプリは Windows Server ライセンスを必要とするため、
AWS 上で動かすとコストが高い。
.NET Core化して Linux で動かせれば、
顧客のコストが下がり、AWS の競争力も上がる。
Microsoft にとっては Azure への囲い込みが弱まるため、
クラウド ベンダ間の競争の産物と見るのが正確である。なお Porting Assistant for .NET も現在は開発が停滞しており、
実務では .NET Upgrade Assistant を使うのが無難である。
- .NET Core2.0移行の移行性に関する報告 - OSSコンソーシアム
https://www.osscons.jp/jofbwaon0-537/
- .NET Core 3 DesktopPack への
移行対応をしてみた(Open棟梁) - OSSコンソーシアム
https://www.osscons.jp/jo0d1tu6a-537/
https://github.com/OpenTouryoProject/OpenTouryo/tree/02-20
https://github.com/OpenTouryoProject/OpenTouryo/tree/SupportNetStandard2%26NetCore2
-
ASCII.jp:.NET Core / .NET Framework / Xamarin / Monoの関係を整理する
http://ascii.jp/elem/000/001/156/1156721/ -
さいきんの.NETのこととかNuGetとかCoreとかよく分からないよねーって話 - Qiita
http://qiita.com/acple@github/items/e80bef939583fc2b0e5e -
.NET Core とマルチプラットフォーム
https://www.slideshare.net/shozon/net-core-66620714
https://learn.microsoft.com/dotnet/api/
- ターゲット フレームワークを切り替えて、
API がどの実装で使えるかを確認できる。
Tags: 移行, .NET開発, .NET Core, .NET Standard