.NET Core 2.0でRHELもcsproj形式をサポートしたり、Fedoraもサポートされるようになったのですが、Red HatやFedoraコミュニティから提供されている.NET Core SDKを入れた状態でVisual Studio CodeでC#プロジェクトを開いてもプロジェクトをロードできないと言われることがあります。この現象についてわかっている範囲でまとめたいと思います。
これはRHEL Serverの画面ですが、dotnet new console
で作成したプロジェクトをVisual Studio Codeで開いた時に警告メッセージが表示されます。
コンソールを開いてエラーメッセージを開くとこんなのが出ています。
[fail]: OmniSharp.MSBuild.ProjectFile.ProjectFileInfo The "Microsoft.NET.Build.Tasks.ReportAssetsLogMessages" task could not be loaded from the assembly /opt/rh/rh-dotnet20/root/usr/lib64/dotnet/sdk/2.0.3/Sdks/Microsoft.NET.Sdk/build/../tools/net46/Microsoft.NET.Build.Tasks.dll. Confirm that the <UsingTask> declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.
どうやらOmniSharp
*1のライブラリがnet46
とあるように、.NET Framework由来のライブラリを参照しようとしているが、RHEL用の.NET Core SDKにはそんなものはないのでプロジェクトのロードに失敗しているようです。
というわけで報告したissueがこちらになります。
どうもOmniSharpでは.NET Framework由来のライブラリを参照し、Linux上ではmono経由で動かしているようです。のですが、RHELやFedoraなど一部のディストリのみでこの問題が起きているようです。その辺の謎は派生したこちらのissueにあります。
.NET Core 2.0からは、.NET Core SDK自体をビルドする手順もオープンソースとして公開されています。が、どうやらこのリポジトリに従ってビルドしただけではnet46
ターゲットの該当ライブラリが含まれていないようです。この問題が起きていないCentOSや他のディストリはおそらくMicrosoftがビルドしたバイナリそのものを利用していて、そちらには該当ライブラリが含まれているようです。
Fedoraに関して言うと、こちらの手順にしたがって2.0.2以降の.NET Core SDKをインストールすることで問題は修正されています。このパッケージはMicrosoftがビルドしたもので、インストールされたファイルの中身を見る限り、該当のライブラリも追加されているようです。
このインストール手順、.NET Core 2.0が出たあとも何度か変更されており、自分の記憶が確かであれば、ある時期はコミュニティ版のパッケージのインストールが案内されていました。そのタイミングでインストールするとこの問題に遭遇したのではと推測しています。
一方のRHELの場合は、source-build側での対応ができていない、かつRHEL向けのパッケージはMicrosoftがビルドしていないため該当ライブラリが含まれていない状態が続いています。回避策としては、たぶん実体は同じだからsymlinkはればいいのでは?という方法が出ています。というわけで次のようなコマンドを実行してみます。
# /opt/rh/rh-dotnet20/root/usr/lib64/dotnet/sdk/2.0.3/Sdks/Microsoft.NET.Sdk/tools/ # ln -s netcoreapp1.0 net46
これで再度Visual Studio CodeでC# プロジェクトを開くと無事にプロジェクトが読み込め、コード編集支援機能が利用できる状態になっています。
根本的な解決にはまだ時間がかかりそうですが、いったんはこちらの方法で回避してみてください。ちなみに、JetBrainsのRiderではこのような問題が発生しないことを確かめています。
*1:Visual Studio CodeはC#のコード支援にOmniSharpを利用している