Open6

.NET10 file-based apps 雑記

akeit0akeit0

.NET10 previewで入ったfile-based appsに関することを書いていく。
あまり触れられてないこと中心。
環境はWindows、PowerShellかGitBash、versionは10.0.100-preview.6.25358.103
IDEはVSCode C# Devkit/C# のpre-releaseが必要。
https://github.com/dotnet/sdk/issues/49189
https://github.com/dotnet/sdk/blob/main/documentation/general/dotnet-run-file.md

既存の問題などはissueで"file-based apps"で調べると出てくる。
https://github.com/dotnet/sdk/issues?q=is%3Aissue state%3Aopen "file-based apps"

akeit0akeit0

実はdotnet runのrunはいらず、dotnetだけで行けるようになってる。(以下ビルドログや実行権限については省略)

program.cs
Console.WriteLine(Environment.Version);
powershell
dotnet program.cs
output
10.0

shebang もそう

program.cs
#!/usr/bin/env dotnet
Console.WriteLine(Environment.Version);
bash
./program.cs

なんなら#! dotnetでもいける
むしろ公式にある#!/usr/bin/dotnet run
bash: ./program.cs: cannot execute: required file not found
と言われて実行できない。

akeit0akeit0

実はPublishAotがimplicitにtrueになっている。
https://github.com/dotnet/sdk/blob/main/documentation/general/dotnet-run-file.md#implicit-project-file
そのため、これだとだめ。

program.cs
#! dotnet
#:property TargetFramework=net6.0
Console.WriteLine(Environment.Version);
error NETSDK1207: Ahead of Time コンパイルはターゲット フレームワークではサポートされていません。

PublishAot = falseにすればいける。

program.cs
#! dotnet
#:property TargetFramework=net6.0
#:property PublishAot = false
Console.WriteLine(Environment.Version);
output
6.0.36

ちなみにpreview5までだとTargetFramework = net6.0のように=の前後に空白が必要だった。

akeit0akeit0

ついでに.csがプロジェクト扱いになったので、buildコマンドが使える。

dotnet build  ./program.cs

ちゃんとrunと同じtemp出力pathが使われる。

akeit0akeit0

普通にconfigurationとかoutput pathとかの指定がargumentでできる。
例えばこうすれば、pwd/test/bin/release以下にdllやexe、pwd/test/obj/release以下にpdbなどが出力される。

bash
./program.cs -c Release -p:BaseOutputPath=test/bin/ -p:BaseIntermediateOutputPath=test/obj/
akeit0akeit0

using SystemしてないことからわかるようにGlobal Usingが使われている。
そのため.net5などC#9以前の言語が使われるバージョンだと言語バージョン指定が必要。
(Nullable enableなのでC#8より前だとまずそこでエラー)

program.cs
#! dotnet
#:property TargetFramework = net48
#:property PublishAot = false
#:property LangVersion = 10
Console.WriteLine(Environment.Version);
output
4.0.30319.42000