窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

.NET Interactiveを.NET 7環境で使う

以前このブログで紹介した.NET Interactive。

.NET InteractiveがC# のREPLとして便利だった - 窓を作っては壊していた人のブログ

最近.NET WebAssemblyについて調査していて、それに関係する.NET 7から追加されたAttributeを使ったアプリケーションを作れないかなと、この便利なREPLを使って実験を試みています。 試してみた所、6.0.100以降7未満のSDKを読み込んでいるようで、7から追加されたAttributeを含むコードをReflectionなどで舐めていくとAssemblyが見つからずに実行時例外が起こってしまいました。

ということで、今回は.NET 7環境で.NET Interactiveを使うために書き換えを行っていこうと思います。

ビルドする

Try .NET 7 by yamachu · Pull Request #1 · yamachu/interactive · GitHub

このPRに書いてあることだけといえばだけです。

これはVSCodeの置換機能を使えば一発なので特に

将来的にキーワードとなる可能性があるため、lowercaseなクラス名などを禁止する CS8981 をcsprojファイルで無視する

また

暗号化関係のクラスはアルゴリズム名を受け取るファクトリメソッドを持っているが、その使用は廃止するから書き換えてくれという SYSLIB0045 をコード書き換えまたはcsprojの書き換えで無視する

  • ビルドに使用する.NET SDKを7系に変える

リポジトリrootにある global.json を適当な値で書き換える

これでビルドが通るので、まずはそれを確認します。

実際に使ってみる

interactive/DEVELOPER-GUIDE.md at main · dotnet/interactive · GitHub

このガイドに沿ってVSCodesettings.json を書き換える。 User設定として置くと、他のマシンとSyncしてしまうため、適当なディレクトリをWorkspaceとして、Workspace設定として設定するのが良いと思う。

参考までに設定を載せておく。

{
    "dotnet-interactive.kernelTransportArgs": [
        "/Users/yk-yamada/Projects/github.com/dotnet/interactive/.dotnet/dotnet",
        "/Users/yk-yamada/Projects/github.com/dotnet/interactive/artifacts/bin/dotnet-interactive/Debug/net7.0/Microsoft.DotNet.Interactive.App.dll",
        "[vscode]",
        "stdio",
        "--working-dir",
        "{working_dir}"
    ],
    "dotnet-interactive.notebookParserArgs": [
        "/Users/yk-yamada/Projects/github.com/dotnet/interactive/.dotnet/dotnet",
        "/Users/yk-yamada/Projects/github.com/dotnet/interactive/artifacts/bin/dotnet-interactive/Debug/net7.0/Microsoft.DotNet.Interactive.App.dll",
        "notebook-parser"
    ]
}

これで実験は出来たのですが、追加されたAttributeはPlatform依存のコードだったため結局自分のやりたいことは出来なかったというオチがあったりします。 まあ.NET 7なInteractive環境が出来たので良しとしましょう。