電波ビーチ

☆(ゝω・)v

VSCodeでC#(mono)を書く

主に競技プログラミングのための環境を整える。つまりアプリを作るようなプロジェクトベースではなく、実行して入力を得て出力するだけのCLIのような感じの使い方。

環境

  • macOS 10.15.5
    • 最近HighSierraからアプデしたけどバッテリー抑制機能に対応してない機種だったのでぴえん
  • VisualStudio Code 1.45.1

mono

なんでC#dotnet)じゃないのかというと、上記目的に沿うような使い方が不明であったため。コマンド一発で特定のcsファイルを実行したいだけなのだが、marketplaceでC#と検索すると出てくるMS公式の拡張機能ではプロジェクト単位でdotnet newする方法が主流らしく、書き捨てのコードを書くのには非常に使い勝手が悪い。それ用の使い方があるのかもしれないがよくわからん

その点monoならばmcscscで任意のファイルをコンパイルmonoでrun、でいいので、適当にタスクを割り当てればよさそうだったのでそうすることにした。

monoを入れる

brew install monoでいけた(気がする)

$ mono -V
Mono JIT compiler version 6.8.0.123 (tarball Fri May 15 17:28:53 BST 2020)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com

バージョンは6.8.0.123。対応しているバージョンはcsc /langversion:?で分かるらしい。

$ csc /langversion:?
Supported language versions:
default
1
2
3
4
5
6
7.0
7.1
7.2
7.3
8.0 (default)
latestmajor
preview

試してみる

コンパイラmcscscの違いは実はよくわかってないのだがよりモダンなのはcscらしい。

ksvi.mff.cuni.cz

atcoderの言語アップデート時のご意見箱(このスプレッドシート)に書いてある実行スクリプトを参考にtasks.jsonにぶちこむ。

"tasks": [
    {
        "label": "compile",
        "type": "shell",
        "command": "csc",
        "args": [
            "-warn:0",
            "-o+",
            "-unsafe",
            "-r:System.Numerics.dll",
            "-langversion:latest",
            "-out:${fileBasenameNoExtension}.exe",
            "${file}",
        ],
        "options": {
            "cwd": "${workspaceFolder}"
        },
        "problemMatcher": [],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    },
    {
        "label": "run(output)",
        "type": "shell",
        "command": "mono",
        "args": [
            "${fileBasenameNoExtension}.exe"
        ],
        "options": {
            "cwd": "${workspaceFolder}"
        },
        "dependsOn": "compile",
        "problemMatcher": [],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    },
    {
        "label": "run(only)",
        "type": "shell",
        "command": "rm",
        "args": [
            "${fileBasenameNoExtension}.exe"
        ],
        "options": {
            "cwd": "${workspaceFolder}"
        },
        "dependsOn": "run(output)",
        "problemMatcher": [],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    },
]

これで +Shift+Brun(only)タスクを呼ぶと、コンパイル・実行・実行ファイル削除までできる。

参考