【C#】 CSCのバージョン メモ (.NET Framework v.s. Roslyn (Visual Studio 2019))

# 概要
NAntで.NET (C#) を弄っていたら、割と最近の文法が使えなかったので、調べてみた。

# Roslynとは
* Roslyn - Wikipedia  
https://ja.wikipedia.org/wiki/Roslyn

> .NETコンパイラプラットフォーム (ドットネット・コンパイラプラットフォーム、英語: .NET Compiler Platform) は、C#及びVisual Basic .NETのフリーかつオープンソースのコンパイラ・コード解析APIである[3]。Roslyn (ロズリン) の通称でも知られている[4]。

&#20;

> 作者	マイクロソフト
> 開発元	.NET Foundation
> 初版	2015年11月19日（4年前）
> 最新版	3.2.0 / 2019年8月9日（11か月前）

※ 2020年08月14日現在


# 総括
* **.NET FrameworkのCSC** と **RoslynのCSC** は別物
   * 名前が同じだけ。 (Roslynが後発の様なので、名前を寄せた？)
   * バージョンが全然違う
     * .NET Framework版はインストールしている.NET Frameworkのバージョンに関連する  
        ``Microsoft (R) Visual C# Compiler version 4.8.3761.0``
     * Roslyn版  
       ``Microsoft (R) Visual C# Compiler バージョン 3.6.0-4.20251.5 (910223b6)`` 
* **.NET Framework版 CSC** はただのコンパイラ
   * さしずめ **JDK javac**
* **Roslyn版 CSC** 開発のためのコンパイラ
   * さしずめ **the Eclipse Compiler for Java** (ecj)
   * **MSBuild** に同梱される
   * IDEに組み込まれることを想定したコンパイラ

## おまけ
* **NAnt** の旨味は今の所 **.Net Framework4.0** + **C# 5** まで
  * **NAnt** の最大の利点は **コンパクトかつ** **ポータブル** なビルド環境
     * **nant-0.92-bin.zip** で **5MB**弱 (軽量かつ導入が楽)
     * MSBuild (Visual Studio Build Tool) のインストールと環境維持は大変
  * **.NET FrameworkのCSC** に依存しているため
* **Roslyn CSC**に対応したビルド ツールを探す意味があまりない
  * **Build Toools** が入っているってことだから、ならもうそのまま **MSBuild** 使えば良いじゃん、という話。。。  

# インストール先

* x86
   * .NET Framework 版
     * C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.ese
   * Roslyn版① (Build Tools for Visual Studio 20019)
      * **C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\Roslyn\csc.exe**
   * Roslyn版② (Microsoft Visual Studio 20019 Community)
      * C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe
* x64
   * .NET Framework 版
     * **C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.ese**
* ~~ia64~~

# 対応文法への言及の抜粋

## .NET Framework版 (C# 5)
> This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

要約
> 古いC# 5 までしかサポートしてないよ。
> 新しいC#の文法でプログラミングしたきゃ、Roslyn使いな。
> ほれ、URLだよ http://go.microsoft.com/fwlink/?LinkID=533240


## Roslyn版 (C# 7.1？)
> -langversion:<string>         `default` (最新のメジャー バージョン)、
>                              `latest` (マイナー バージョンを含む最新バージョン) または 
>                              `6` や `7.1` などの特定のバージョンにより、


# csc /? の出力内容比較
## .NET Framework版
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /?

```text:csc&nbsp;/?
Microsoft (R) Visual C# Compiler version 4.8.3761.0

for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.



This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

                        Visual C# Compiler のオプション

                        - 出力ファイル -
/out:<ファイル>                出力ファイル名を指定します (既定: メイン クラスかファースト ファイルを伴うファイルのベース名)。
/target:exe                    コンソール アプリケーションをビルドします (既定)。 (短い形式: /t:exe)
/target:winexe                 Windows 実行可能ファイルをビルドします。 (短い形式: /t:winexe)
/target:library                ライブラリをビルドします。 (短い形式: /t:library)
/target:module                 別のアセンブリに追加できるモジュールをビルドします。 (短い形式: /t:module)
/target:appcontainerexe        Appcontainer 実行可能ファイルのビルド (短い形式: /t:appcontainerexe)
/target:winmdobj               WinMDExp で使用される Windows ランタイムの中間ファイルのビルド (短い形式: /t:winmdobj)
/doc:<ファイル>                生成する XML ドキュメント ファイル
/platform:<文字列>             このコードが実行されるプラットフォームの制限: x86、Itanium、x64、arm、anycpu32bitpreferred、または anycpu。既定は anycpu です。

                        - 入力ファイル -
/recurse:<ワイルドカード>      ワイルドカードの指定に従い、現在のディレクトリとサブディレクトリ内のすべてのファイルをインクルードします。
/reference:<エイリアス>=<ファイル>
                               指定されたエイリアスを使用して、指定されたアセンブリ ファイルからメタベースを参照する (短い形式: /r)
/reference:<ファイル リスト>   指定されたアセンブリ ファイルからメタベースを参照する (短い形式: /r)
/addmodule:<ファイル リスト>   指定されたモジュールをこのアセンブリにリンクする
/link:<ファイル リスト>        指定された相互運用機能アセンブリ ファイルからメタデータを埋め込みます (短い形式: /l)

                        - リソース -
/win32res:<ファイル>           Win32 リソース ファイルを指定します (.res)。
/win32icon:<ファイル>          出力にこのアイコンを使用します。
/win32manifest:<ファイル>      Win32 マニフェスト ファイル (.xml) を指定してください。
/nowin32manifest               既定の Win32 マニフェストを含めません。
/resource:<リソース情報>       指定したリソースを埋め込みます。 (短い形式: /res)
/linkresource:<リソース情報>   このアセンブリに指定されたリソースをリンクします。 (短い形式: /linkres)
                               リソース情報の形式は <ファイル>[,<文字列名>                                     [,public|private]] です。

                        - コード生成 -
/debug[+|-]                    デバッグ情報を生成する
/debug:{full|pdbonly}          デバッグの種類を指定します (既定値は full で、実行中のプログラムにデバッガーを付加することができます)。
/optimize[+|-]                 最適化を有効にする (短い形式: /o)

                        - エラーと警告 -
/warnaserror[+|-]              すべての警告をエラーとして報告する
/warnaserror[+|-]:<警告リスト> 指定した警告をエラーとして報告する
/warn:<n>                      警告レベル (0-4) を設定する (短い形式: /w)
/nowarn:<警告リスト>           指定の警告メッセージを無効にする

                        - 言語 -
/checked[+|-]                  オーバーフロー チェックの生成
/unsafe[+|-]                   アンセーフ コードの許可
/define:<シンボル リスト>      条件付きコンパイル シンボルを定義する (短い形式: /d)
/langversion:<文字列>          言語バージョン モードの指定: ISO-1、ISO-2、3、4、5、または Default

                        - セキュリティ -
/delaysign[+|-]                厳密な名前のキーのパブリックな部分のみを使ってアセンブリを遅延署名します。
/keyfile:<ファイル>            厳密な名前のキー ファイルを指定します。
/keycontainer:<文字列>         厳密な名前のキー コンテナーを指定します。
/highentropyva[+|-]            高エントロピ ASLR の有効化
/enforcecodeintegrity[+|-]     Enforce code intergrity checks on all inputs to the compiler and enable loading compiled assemblies by other programs that enforce code integrity if the operating system is configured to do so.

                        - その他 -
@<ファイル>                    応答ファイルを読み取り、オプションを追加します。
/help                          この使用法のメッセージを表示します。 (短い形式: /?)
/nologo                        コンパイル時の著作権メッセージを表示しません。
/noconfig                      CSC.RSP ファイルを自動的に含めません。

                        - 詳細 -
/baseaddress:<アドレス>        ビルドするライブラリのベース アドレスです。
/bugreport:<ファイル>          'バグ報告' ファイルを作成します
/codepage:<n>                  ソース ファイルを開くときに使用するコードページを指定します。
/utf8output                    UTF-8 エンコードでコンパイラのメッセージを出力する
/main:<型>                     エントリ ポイントを含む型を指定します (他のエントリ ポイントはすべて無視します)。 (短い形式: /m)
/fullpaths                     コンパイラは絶対パスを生成します。
/filealign:<n>                 出力ファイル セクションで使用する配置を指定します。
/pdb:<ファイル>                デバッグ情報ファイル名を指定します (既定: .pdb 拡張子の付いた出力ファイル名)
/errorendlocation              各エラーの終了位置の出力行と出力列
/preferreduilang               出力用の言語名を指定します。
/nostdlib[+|-]                 標準ライブラリ (mscorlib.dll) を参照しない
/subsystemversion:<文字列>     このアセンブリのサブシステム バージョンを指定してください
/lib:<ファイル リスト>         参照を検索する追加のディレクトリを指定します。
/errorreport:<文字列>          内部コンパイラ エラーの処理方法を指定します: prompt、send、queue、または none です。既定値は queue です。
/appconfig:<ファイル>          アセンブリ バインディング設定を含むアプリケーション構成ファイルを指定してください
/moduleassemblyname:<文字列>   このモジュールが一部となるアセンブリ名です
```


## Roslyn版 (C# 7.1？)
``C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\Roslyn\csc.exe /?``

MSBuildToolsを更新したので、こっちで。

```text:csc&nbsp;/?
Microsoft (R) Visual C# Compiler バージョン 3.6.0-4.20251.5 (910223b6)
Copyright (C) Microsoft Corporation. All rights reserved.


                             Visual C# Compiler のオプション

                       - 出力ファイル -
-out:<file>                   出力ファイル名を指定します (既定: メイン クラスを含むファイル
                              または最初のファイルのベース名)
-target:exe                   コンソール実行可能ファイルをビルドします (既定) (短い
                              形式: -t:exe)
-target:winexe                Windows 実行可能ファイルをビルドします (短い形式:
                              -t:winexe)
-target:library               ライブラリをビルドします (短い形式: -t:library)
-target:module                別のアセンブリに追加できるモジュールを
                              ビルドします (短い形式: -t:module)
-target:appcontainerexe       Appcontainer 実行可能ファイルをビルドします (短い形式:
                              -t:appcontainerexe)
-target:winmdobj              WinMDExp で使用される
                              Windows ランタイムの中間ファイルをビルドします (短い形式: -t:winmdobj)
-doc:<file>                   生成する XML ドキュメント ファイル
-refout:<file>                生成する参照アセンブリの出力
-platform:<string>            このコードを実行できるプラットフォームを x86、
                              Itanium、x64、arm、arm64、anycpu32bitpreferred、
                              anycpu に限定します。既定値は anycpu です。

                       - 入力ファイル -
-recurse:<wildcard>           ワイルドカードの指定に従い、現行ディレクトリおよび
                              サブディレクトリ内のすべてのファイルを
                              インクルードします
-reference:<alias>=<file>     指定されたエイリアスを使用して、指定された
                              アセンブリ ファイルのメタデータを参照します (短い形式: -r)
-reference:<file list>        指定されたアセンブリ ファイルのメタデータを
                              参照します (短い形式: -r)
-addmodule:<file list>        指定されたモジュールをこのアセンブリにリンクします
-link:<file list>             指定された相互運用アセンブリ ファイルの
                              メタデータを埋め込みます (短い形式: -l)
-analyzer:<file list>         このアセンブリからアナライザーを実行します
                              (短い形式: -a)
-additionalfile:<file list>   コード生成には直接影響しないものの、
                              アナライザーがエラーまたは警告を
                              生成するときに使用する可能性のある追加ファイル。
-embed                        すべてのソース ファイルを PDB に埋め込みます。
-embed:<file list>            特定のファイルを PDB に埋め込みます。

                       - リソース -
-win32res:<file>              Win32 リソース ファイル (.res) を指定します
-win32icon:<file>             出力にこのアイコンを使用します
-win32manifest:<file>         Win32 マニフェスト ファイル (.xml) を指定します
-nowin32manifest              既定の Win32 マニフェストはインクルードしません
-resource:<resinfo>           指定されたリソースを埋め込みます (短い形式: -res)
-linkresource:<resinfo>       指定されたリソースをこのアセンブリにリンクします
                              (短い形式: -linkres) resinfo の形式
                              は <file>[,<string name>[,public|private]] です

                       - コード生成 -
-debug[+|-]                   デバッグ情報を出力します
-debug:{full|pdbonly|portable|embedded}
                              デバッグの種類を指定します ('full' が既定値です。
                              'portable' はクロスプラットフォーム形式です。
                              'embedded' は、ターゲット .dll または .exe に
                              埋め込まれるクロスプラットフォーム形式です)
-optimize[+|-]                最適化を有効にします (短い形式: -o)
-deterministic                決定論的アセンブリを生成します
                              (モジュール バージョン GUID やタイムスタンプを含みます)
-refonly                      メイン出力の代わりに参照アセンブリを生成します
-instrument:TestCoverage      カバレッジ情報を収集するようにインストルメント化された
                              アセンブリを生成します
-sourcelink:<file>            PDB に埋め込むソース リンク情報。

                       - エラーと警告 -
-warnaserror[+|-]             すべての警告をエラーとして報告します
-warnaserror[+|-]:<warn list> 特定の警告をエラーとして報告します
                              (Null 値の許容の警告をすべて含めるには "nullable" を使用します)
-warn:<n>                     警告レベル (0-4) を設定します (短い形式: -w)
-nowarn:<warn list>           特定の警告メッセージを無効にします
                              (Null 許容性の警告をすべて含めるには "nullable" を使用します)
-ruleset:<file>               特定の診断を無効にするルールセット ファイルを
                              指定します。
-errorlog:<file>[,version=<sarif_version>]
                              すべてのコンパイラおよびアナライザーの診断を
                              ログに記録するためのファイルを指定します。
                              sarif_version:{1|2|2.1} 既定値は 1 です。2 と 2.1 は、
                              どちらも SARIF バージョン 2.1.0 を意味します。
-reportanalyzer               追加のアナライザー情報を報告します
                              (実行時間など)。

                       - 言語 -
-checked[+|-]                 オーバーフロー検査を生成します
-unsafe[+|-]                  '安全でない' コードを許可します
-define:<symbol list>         条件付きコンパイル シンボルを定義します (短い
                              形式: -d)
-langversion:?                許容される言語バージョンの値を表示します。
-langversion:<string>         `latest` (マイナー バージョンを含む最新バージョン)、
                              `default` (`latest` と同様)、
                              `latestmajor` (マイナー バージョンを除く最新バージョン)、
                              `preview` (サポートされないプレビューの機能を含む、最新バージョン)、
                              または `6` や `7.1` などの特定のバージョンなど、
                              言語バージョンを指定します
-nullable[+|-]                Null 許容コンテキスト オプションの enable|disable を指定します。
-nullable:{enable|disable|warnings|annotations}
                              Null 許容コンテキスト オプションの enable|disable|warnings|annotations を指定します。

                       - セキュリティ -
-delaysign[+|-]               厳密な名前キーのパブリックな部分のみを使って
                              アセンブリを遅延署名します
-publicsign[+|-]              厳密な名前キーのパブリックな部分のみを使って
                              アセンブリを公開署名します
-keyfile:<file>               厳密な名前キーのファイルを指定します
-keycontainer:<string>        厳密な名前キーのコンテナーを指定します
-highentropyva[+|-]           高エントロピ ASLR を有効にします

                       - その他 -
@<file>                       応答ファイルを読み取り、オプションを追加します
-help                         この使用法に関するメッセージを表示します (短い形式: -?)
-nologo                       コンパイラの著作権メッセージを表示しません
-noconfig                     CSC.RSP ファイルを自動的に含めません
-parallel[+|-]                ビルドを並列処理します。
-version                      コンパイラ バージョンの数字を表示して終了します。

                       - 高度なオプション -
-baseaddress:<address>        ビルドするライブラリのベース アドレスです
-checksumalgorithm:<alg>      PDB に格納されているソース ファイルのチェックサム
                              を計算するアルゴリズムを指定します。サポートされる値:
                              SHA1 または SHA256 (既定)。
-codepage:<n>                 ソース ファイルを開くときに使用するコードページを
                              指定します
-utf8output                   コンパイラ メッセージを UTF-8 エンコードで出力します
-main:<type>                  エントリ ポイントを含む型を指定します
                              (他のエントリ ポイントはすべて無視します) (短い
                              形式: -m)
-fullpaths                    コンパイラは完全修飾パスを生成します
-filealign:<n>                出力ファイル セクションで使用する配置を
                              指定します
-pathmap:<K1>=<V1>,<K2>=<V2>,...
                              コンパイラが出力するソース パス名のマッピングを
                              指定します。
-pdb:<file>                   デバッグ情報ファイル名を指定します (既定:
                              .pdb 拡張子の付いた出力ファイル名)
-errorendlocation             各エラーの終了位置の出力行と
                              出力列
-preferreduilang              出力用の優先する言語名を指定します。
-nosdkpath                    標準ライブラリ アセンブリの既定の SDK パスの検索を無効にします。
-nostdlib[+|-]                標準ライブラリ (mscorlib.dll) は参照しません
-subsystemversion:<string>    このアセンブリのサブシステム バージョンを指定します
-lib:<file list>              参照を検索する追加ディレクトリを
                              指定します
-errorreport:<string>         内部コンパイラ エラーの処理方法:
                              (prompt、send、queue、none) を指定します。既定値は 
                              queue です。
-appconfig:<file>             アセンブリ バインド設定を含む
                              アプリケーション構成ファイルを指定します
-moduleassemblyname:<string>  このモジュールが含められる
                              アセンブリの名前
-modulename:<string>          ソース モジュールの名前を指定します

```

# 備考
個人的にはプログラム環境のポータブル性も、十分な評価点になると思ってたりしている。気軽にプログラムミングを楽しみたいし、100行程度の適当なコードのために、何GBもするツールを入れるのは、最早良くわからない感じがある。

Windows 10にはMSBuildも同梱されている様なのと、nugetでもRoslynが入手出来るみたいなので。それらをうまく組み合わせて、コンパクトで最新のC#環境つくれないかなぁ。。。


# 参考
* NAnt - A .NET Build Tool
  http://nant.sourceforge.net/

* Building .NET 4.5 Projects with Nant - Stack Overflow
  https://stackoverflow.com/questions/11837795/building-net-4-5-projects-with-nant

* Visual Studio 2015 と .NET Framework 4.6.1 の csc (C#コンパイラー) の違いについて - Qiita
  https://qiita.com/cointoss1973/items/62d20440358763328180

* Roslyn - Wikipedia
  https://ja.wikipedia.org/wiki/Roslyn

* MSBuild - Wikipedia
  https://ja.wikipedia.org/wiki/MSBuild

* C#の言語バージョンと.NETバージョン - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
  https://ufcpp.net/study/csharp/cheatsheet/listfxlangversion/

* roslyn - インストールまたはセットアップ | roslyn Tutorial https://riptutorial.com/ja/roslyn/example/9841/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97

* -langversion (C# コンパイラ オプション) | Microsoft Docs
  https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/langversion-compiler-option