.NET10 file-based apps 雑記

.NET10 previewで入ったfile-based appsに関することを書いていく。
あまり触れられてないこと中心。
環境はWindows、PowerShellかGitBash、versionは10.0.100-preview.6.25358.103
IDEはVSCode C# Devkit/C# のpre-releaseが必要。
既存の問題などはissueで"file-based apps"で調べると出てくる。

実はdotnet runのrunはいらず、dotnetだけで行けるようになってる。(以下ビルドログや実行権限については省略)
Console.WriteLine(Environment.Version);
dotnet program.cs
10.0
shebang もそう
#!/usr/bin/env dotnet
Console.WriteLine(Environment.Version);
./program.cs
なんなら#! dotnet
でもいける
むしろ公式にある#!/usr/bin/dotnet run
は
bash: ./program.cs: cannot execute: required file not found
と言われて実行できない。

実はPublishAotがimplicitにtrueになっている。
そのため、これだとだめ。#! dotnet
#:property TargetFramework=net6.0
Console.WriteLine(Environment.Version);
error NETSDK1207: Ahead of Time コンパイルはターゲット フレームワークではサポートされていません。
PublishAot = falseにすればいける。
#! dotnet
#:property TargetFramework=net6.0
#:property PublishAot = false
Console.WriteLine(Environment.Version);
6.0.36
ちなみにpreview5までだとTargetFramework = net6.0
のように=
の前後に空白が必要だった。

ついでに.cs
がプロジェクト扱いになったので、buildコマンドが使える。
dotnet build ./program.cs
ちゃんとrunと同じtemp出力pathが使われる。

普通にconfigurationとかoutput pathとかの指定がargumentでできる。
例えばこうすれば、pwd/test/bin/release以下にdllやexe、pwd/test/obj/release以下にpdbなどが出力される。
./program.cs -c Release -p:BaseOutputPath=test/bin/ -p:BaseIntermediateOutputPath=test/obj/

using System
してないことからわかるようにGlobal Usingが使われている。
そのため.net5
などC#9以前の言語が使われるバージョンだと言語バージョン指定が必要。
(Nullable enableなのでC#8より前だとまずそこでエラー)
#! dotnet
#:property TargetFramework = net48
#:property PublishAot = false
#:property LangVersion = 10
Console.WriteLine(Environment.Version);
4.0.30319.42000