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

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

.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環境が出来たので良しとしましょう。

.NET 7 previewのwasm-toolsを簡単に試せるRepositoryとDocker Imageを公開しました

先日C100で頒布予定の記事の内容のざっくり宣伝をしました。

teitoku-window.hatenablog.com

今回は頒布予定の記事にて紹介しているリポジトリの宣伝です。

wasm-tools workloadは、.NET 7 preview6 から、今月中旬頃公開されそうなpreview7の間でガッツリ変更が加わっています。 それに備えて予め試しておきたい、または新たなAPIを見ておきたい!みたいな人に向けたサンプルのリポジトリを今回は用意しました。

github.com

現在リリースされているpreview6に加え、今月中に公開されそうなpreview7相当のテンプレートと追加されたAPIを実際に試したコード、また2022年7月末時点のwasm-toolsおよびそのテンプレートが実際に試すことが出来ます。

と言っても実際に試すには

GitHub - dotnet/runtime: .NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.

このリポジトリをcloneしてビルドする必要があるのですが………

流石にruntimeのビルド環境を整えるのは面倒なので、Dockerfileも作成してあります。

try-net7-dotnet-webassembly/Dockerfile at master · yamachu/try-net7-dotnet-webassembly · GitHub

それも面倒な方は

https://hub.docker.com/r/yamachu/dotnet-wasm-tools

こちらをどうぞ。

Dockerfileの中身を見れば大体わかりますが、

$ docker exec -v `pwd`:/work yamachu/dotnet-wasm-tools:latest dotnet new wasmconsole -o mysampleproject
$ docker exec -v `pwd`/mysampleproject:/work yamachu/dotnet-wasm-tools:latest dotnet publish

みたいな感じで試せると思います。

arm64向けのイメージは用意できていません… x64環境でビルドしたイメージを使って、プロジェクト自体は作成できるのですが、publishの段階でハングしてしまいます。

ここに関しては現在調査中。

arm64環境で試したい場合は自分で dotnet/runtime のビルドとファイル書き換えが必要なので頑張ってください…

github.com