開発環境を使わずにC#をスクリプトのように利用する

##サマリー
Windows上でちょっとした処理をさせたい場合、バッチファイルやPowerShellを利用するのが一般的かと思いますが、バッチファイルにはそこまで精通していなく、かつ柔軟度は必ずしも高くないですし、PowerShellは（Linuxコマンドと等価なものもあるので多少触れますが）まだ覚えていません。

C#はたまに書いているのでC#で書きたくなるのですが、わざわざ開発環境でビルドするまではしたくなく、自分の端末・環境でロジックは書いて準備し、本番環境のセットアップに持ち込み、そこで、ちょっと修正もできるようにしたいなぁと思って、こんなものを考えてみました。（本番環境にVisualStudioをインストールなどはしない、というのも考慮しています）

##C#のコード自体を試したいなら
[.NET Fiddle](https://dotnetfiddle.net/)とか、別の記事に書いてあります[【初心者向け】Online完結！Web開発環境クッキングレシピ[ver 2019.11]-その１](https://qiita.com/yellow-strelitzia/items/de1c489908792a65436e)の Gitpod、その他同等のものを利用したほうがよいです。

##ツールについて
こちらに置いてあります。
[CSBuildRun](https://github.com/yellow-strelitzia/CSBuildRun)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530472/30a2329c-bd03-6e23-c8b6-8c232b421682.png)

##Windowsと.NET Runtime標準搭載
もうすぐお別れのWindows7、そこから現役のWindows10まで、.NET Runtimeは標準搭載です。自分のWindows端末であれば、
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
ここに C#のコンパイラ（csc.exe)が普通に含まれています。csc.exe XXX.csとすることで、C#コードをコンパイルすることができます。

##構成について
C#ファイルとバッチファイル、configファイルで構成されています。

- Bootstrap.bat : Bootstrap.csをコンパイルし、BuildAndRun.exeを生成します
- Bootstrap.cs : C#コード（Main.cs)を実行時に読み込み、コンパイルしてMain.csの中のMainClassに定義される、startup()を呼び出す実装にしてあります
- BuildAndRun.exe.config : BuildAndRun.exeの設定ファイルひな形です
- Main.cs : スクリプト的に扱う、カスタマイズして利用する、動的にコンパイルされる対象のファイルです。

##使い方
Bootstrap.batを実行します。初めにどの.Netを利用するか尋ねられます。番号を選択します

```
Please select target dot net version.
0-".Net4.0" (C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\)
1-".Net4.0(x64)" (C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\)
```
次にビルドするタイプ（コマンドライン、GUI、管理者権限昇格の有無）を問われるので、番号を選択します。

```
Please select build type (0:command line 1:command line(admin) 2:window 3:window(admin).
```

これでBuildAndRun.exeが生成されます。
Bootstrap.batにPlease select build typeを０と答えていれば、実行すると

```
start sample
finish sample
```

と表示されていると思います。

実際にはなにかスクリプト的に処理を実施させたいので、Main.csの下記部分を変更してみます。

``` Main.cs
  //--------------------------------------------------
  /// <summary>
  /// Entry point of CUI code
  /// </summary>
  /// <remarks>
  /// Entry point of CUI code
  /// </remarks>
  //--------------------------------------------------		
  public override void startCUI()
  {
    System.Console.WriteLine("start sample");

    /* sample code, but can't run with .net 2.0 , so commented out
    Func<string, bool> handleFiles = (string path) => {
      Console.WriteLine(path);
      return true;
    };

    IEnumerable<string> results = 
      BuildAndRunUtil.ProcessRecurcively("c:\\", "*.txt", handleFiles);
    */

    System.Console.WriteLine("finish sample");
  }
```

``` Main.cs
  public override void startCUI()
  {
    System.Console.WriteLine(DateTime.Now.ToString());
  }
```

再度BuildAndRun.exeを実行すれば、日付出力に変わったはずです。

試しに、System.Console.WriteLine(DateTime.Now.ToString());の最後のセミコロンを削除してBuildAndRun.exeを実行すると

``` 
Line number 85, Error Number: CS1002, '; が必要です。;
```

と怒られるはずです。
コードをカスタマイズして、依存するアセンブリがある場合、BuildAndRun.exe.configのAssemblyRefsを任意に編集してください。

``` BuildAndRun.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <!--
        <add key="InputSourceCode" value="Main.cs"/>
        <add key="InputStartupClass" value="MainClass"/>
        -->
        <add key="InputSourceCode" value="Main.cs"/>
        <add key="InputStartupClass" value="MainClass"/>
        <add key="InputStartupMethod" value="startup"/>
        <add key="AssemblyRefs" value="mscorlib.dll,System.dll,System.Core.dll,System.Drawing.dll,System.Windows.Forms.dll,System.Data.dll,System.Xml.dll,Microsoft.CSharp.dll"/>
        <add key="AssemblyRefs20" value="mscorlib.dll,System.dll,System.Drawing.dll,System.Windows.Forms.dll,System.Data.dll,System.Xml.dll"/>
    </appSettings>
</configuration>
```


##その他
- 新しい.NETではRoslyn for Scriptingがそもそも存在する ( [未確認飛行 Cさんの記事](https://ufcpp.net/study/csharp/cheatsheet/apscripting/) )

ただ、.NET 2.0しか入っていないシステムではこれは使えないので、今回記事の方式だと対応できる　（バイナリは一切持ち込まない、ともいえる）

- .NET CoreならインストールせずともXCOPYベースで利用できる

XCOPYで動くならばインストールではないので、良いかもしれないです。


- .NET Frameworkの最新RuntimeがインストールされていてもC:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\のcsc.exeは C#Version５くらいまでしか対応していない