.NET Framework と .NET Core と Mono の違いがわからない
これまでの流れ
はじめて C# に触れたのは Windows XP 機の Visual Studio Express 2008 上で、今から 5 年前のことになります。まずは CLI のプログラムを見よう見まねで作成し、それからひと月かかって Windows.Forms を使った GUI アプリを作成しました(メモ)。個人的にはこの頃から Microsoft に対して好印象を持つようになりました。
それからしばらくして、MBP に Mono を入れて先の CLI プログラムを動かそうとしましたが、そのままではコンパイルが通りません。若干の修正をすることにより動くようになりました(メモ)。
そして先日、Visual Studio Code に C# 機能拡張を入れて環境を整え(メモ)、同じようにコンパイルをしてみましたが、またしてもそのままでは動きませんでした。
解決に時間はかかってしまいましたが、動くようになりました。これはその時の作業記録です。
ArrayList が使えないので、System.Collections.Generic から List を使うようにした。
static ArrayList LIST = new ArrayList(); ↓ static List<List<string>> LIST = new List<List<string>>();
StreamReader のところが変わったので対応。StackOverflow に解答あり。エンコーディングを指定しなくて良いのかしら?デフォルトが UTF-8 になってるとか?
StreamReader sr = new StreamReader(dictfile, Encoding.GetEncoding("utf-8")); ↓ StreamReader sr = new StreamReader(File.OpenRead(dictfile));
内部辞書の自称コンスセルを作る部分を修正
string[] pairs = new string[2]; ↓ List<string> pairs = new List<string>(); pairs[0] = pair[0]; pairs[1] = pair[2]; ↓ pairs.Add(pair[0]); pairs.Add(pair[2]);
StreamReader を閉じようとするとエラーになることの対応。次のようなエラーが出るのでコメントアウトしたのだけれど、どうすれば良いのだろう?
‘StreamReader’ does not contain a definition for ‘Close’ and no extension method ‘Close’ accepting a first argument of type ‘StreamReader’ could be found (are you missing a using directive or an assembly reference?)
これまた StackOverflow に解答あり。
sr.Close(); ↓ sr.Dispose();
以上の修正で .NET Core でもコンパイルが出来て動くようになりました。
ちなみにこのソースは mcs でもコンパイルができて mono で問題なく実行することができました。また、Windows XP の VSE でもそのままで OK です。コマンドプロンプトなら C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe Program.cs
で Program.exe
が出力されます。
(v2.0.50727 の csc.exe も大丈夫だったのですけれども、v4.0.30319 では
‘RegularExpressions’ は名前空間 ‘System.Text’ に存在しません。アセンブリ参照が不足しています。
というエラーが出てうまくいきませんでした。.NET Framework もバージョンによって違うのですね。)
疑問
実質 Windows でしか使われていなかった .NET Framework を Linux 等でも使えるように Mono プロジェクトが頑張って、広まってきたところを MS が横取りして、みんなに配るには容量が大きいので機能縮小版の .NET Core をこさえた感じ?