sci

最果て風呂

.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# 機能拡張を入れて環境を整え(メモ)、同じようにコンパイルをしてみましたが、またしてもそのままでは動きませんでした。

解決に時間はかかってしまいましたが、動くようになりました。これはその時の作業記録です。

  1. ArrayList が使えないので、System.Collections.Generic から List を使うようにした。

     static ArrayList LIST = new ArrayList();
      ↓
     static List<List<string>> LIST = new List<List<string>>();
    
  2. StreamReader のところが変わったので対応。StackOverflow に解答あり。エンコーディングを指定しなくて良いのかしら?デフォルトが UTF-8 になってるとか?

     StreamReader sr = new StreamReader(dictfile, Encoding.GetEncoding("utf-8"));
      ↓
     StreamReader sr = new StreamReader(File.OpenRead(dictfile));
    
  3. 内部辞書の自称コンスセルを作る部分を修正

     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]);
    
  4. 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 XPVSE でもそのままで OK です。コマンドプロンプトなら C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe Program.csProgram.exe が出力されます。

(v2.0.50727 の csc.exe も大丈夫だったのですけれども、v4.0.30319 では

RegularExpressions’ は名前空間 ‘System.Text’ に存在しません。アセンブリ参照が不足しています。

というエラーが出てうまくいきませんでした。.NET Framework もバージョンによって違うのですね。)

疑問

実質 Windows でしか使われていなかった .NET Framework を Linux 等でも使えるように Mono プロジェクトが頑張って、広まってきたところを MS が横取りして、みんなに配るには容量が大きいので機能縮小版の .NET Core をこさえた感じ?