.NETとマルチプラットフォーム
C#でマルチプラットフォームなアプリケーションを作りたかった時に、調べたことを自分用メモとしてまとめました。
たまには違う言語も書いたら?
C#の実行環境
C#はIL(中間言語;Intermediate Language)にコンパイルされ、仮想環境上で動くコンパイル系言語です。概念的にはJavaと同じです。 JavaがJRE(Java Runtime Environment)上で動いているように、C#は.NET上で動いています。 たまに勘違いをしている人がいますが、スクリプト系言語ではありません。1
もともとC#はMicrosoftが作った言語なので.NET FrameworkはWindowsでしか動きません。ですが、JavaがWindowsでもlinuxでも動くのと同様、原理的には他OS向けの.NET Framework互換のものがあれば、C#はどこでも動きます。
そこでMonoという.NET framework互換のものをlinuxやmac向けにどこかの偉い人が作りました。なのでMonoさえインストールすればWindowsで動いていたC#のコードがそのままmacでも動きます。すごい。
マルチプラットフォームを謳っているUnityもC#の実行にMonoを使ってます。(Unity はIL2CPPだとか多少特殊ですが)
.NET Frameworkと.NET Core
.NET FrameworkというのはCLI(共通言語基盤;Common Language Infrastructure)、GC(ガベージコレクション)、JIT(just in time compiler)、標準ライブラリ等を全部あわせた環境全体のことを言います。(で本当にあってるんでしょうか?私はそういう認識してますが正しいのか微妙)
コンソールアプリケーションなら前述の通り、Monoを使うとlinuxでも動くんですが、さすがにWindows formとかWPFなんかのウィンドウズアプリケーションは動かないんですよね。彼らは内部でwin32 APIやDirextXとかを呼んでいるのでそれはまあ当たり前です。
そこで.NET FrameworkのうちWindows/Mac/LInuxの共通部分だけをとりだして、いい感じにまとめた.NET Coreというのが登場します。 そういうわけで、.NET Coreはクロスプラットフォームで動作します。
.NET Coreの実行ファイルは全てWindows PEファイル形式の.dllで作成されます。 それは、色々とその方が都合がいいからだそうです。 詳しくはこの辺参照。
実行ファイル(app.dll)に対して、コマンドで
dotnet app.dll
というように実行できます。
dotnet
コマンドからの実行じゃなくて、直接実行可能ファイル(Windowsでいうexeファイル)で欲しいという場合も、実行可能ファイルを出力できます。
.NETのランタイムエンジンそのものも一緒に出力されるため、.NETのランタイムがインストールされていないマシンでもそのまま実行できます。
やり方はこのサイトに書いてあるので。
Xamarin, .NET Standard
XamarinはC#でMac/Android/iOSを開発するための.NETです。触ったことないので詳しくはわかりません。UIはxamlベースでいい感じに開発できるそうです。 いつか触ってみたい。
もう一つ、.NETの種類で.NET Standardというのがあります。これは、.NET Framework/ .NET Core/ Xamarinの全てで使用可能なライブラリを作成するための.NETです。いわば各種.NETの汎用部分のAPIを定義したAPI仕様です。
つまり、.NET Standardを対象に作成されたライブラリは.NET Framework/ .NET Core/ Xamarinの全てから使用可能ということです。 逆に言うと、特定のフレームワークでしか実行できないようなライブラリは、.NET Standard 向けのライブラリとして提供してはダメということです。
まあ実際のところ、行儀のいい(?)ピュアC#なコードしか使っていないライブラリの場合は だいたい.NET Standard 向けでビルドして提供して問題ないはずです。(行儀の良い、という説明が説明になっていない気がするがどう言えばいいんだろう。。。)
まとめ
C#でWindowsはもちろん、MacもlinuxもAndroidもiOSアプリケーションも開発できるのはすごい。
あと、本記事はMSDNこのページとかその他いろいろを参考に自分なりに噛み砕いたものです。
https://msdn.microsoft.com/ja-jp/magazine/mt842506.aspxmsdn.microsoft.com
おしまい
あと結果的に本記事より、下のこのページの方が簡潔で分かりやすかった
よかったですねぇ~