EmacsにOmnisharpをinstallする際嵌まったお話

### はじめに

名古屋でWEB系エンジニアをやっている片田です

ある日、Emacsにomnisharpをインストールしようとしたら嵌まったのでシェアしようと思います

### TL;DR
#### Omnisharpをインストールできない問題
- `lsp-install-server`からはインストールできなかった
- Omnisharpを手動でインストールすることにて解決

#### Omnisharpが動かない問題
- 原因は`libhostfxr.dylib`が読み込めていなかった
- 環境変数`DOTNET_ROOT`に.NET Coreのパスを設定することで解決

### 環境
- M2 Mac(Sonoma 14.12.1)
- .NET Core 8.0.3 (asdfでインストール)
- Emacs GNU 28.2

### Omnisharpをインストールできない
```
LSP :: Download omnisharp started.
LSP :: Starting to download https://github.com/omnisharp/omnisharp-roslyn/releases/latest/download/omnisharp-osx-arm64-net6.0.zip to /Users/s-katada/.emacs.d/.cache/lsp/omnisharp-roslyn/latest/omnisharp-roslyn.zip.zip...
Contacting host: github.com:443
Saving file /Users/s-katada/.emacs.d/url/cookies...
Wrote /Users/s-katada/.emacs.d/url/cookies
LSP :: Server omnisharp install process failed with the following error message: (file-missing Opening URL No such file or directory https://github.com/omnisharp/omnisharp-roslyn/releases/latest/download/omnisharp-osx-arm64-net6.0.zip).
Check `*lsp-install*' and `*lsp-log*' buffer.
```

`lsp-install-server`関数でomnisharpをインストールできませんでした
ChatGPTやClaude3にお尋ねしたところ、ネットワークが悪いと言われたが特に問題はありませんでした


### 直接インストールしてみる

```
cd ~/.emacs.d/.cache/lsp/omnisharp-roslyn/latest
curl -OL https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v1.39.1/omnisharp-osx-arm64-net6.0.zip && unzip omnisharp-osx-arm64-net6.0.zip
```

正常にインストールができました!

### Omnisharpが動作しない...

```
M-x RET lsp
LSP :: Connected to [omnisharp:59684/starting /Users/s-katada/git/private/dotnet_todo_app][semgrep-ls:59685/starting /Users/s-katada/git/private/dotnet_todo_app].
LSP :: omnisharp has exited (exited abnormally with code 131)
LSP :: semgrep-ls:59685 initialized successfully in folders: (/Users/s-katada/git/private/dotnet_todo_app)
Server omnisharp:59684/starting exited (check corresponding stderr buffer for details). Do you want to restart it? (y or n) y
LSP :: Restarting LSP in buffer Program.cs
LSP :: Connected to [omnisharp:60043/starting /Users/s-katada/git/private/dotnet_todo_app][semgrep-ls:59685 /Users/s-katada/git/private/dotnet_todo_app].
LSP :: omnisharp has exited (exited abnormally with code 131)
```

インストールはできましたが動作しないです...なぜがExitしてしまいます...
*lsp-logを確認したがどこでエラーが起きているかわかりませんでした

### シェルから直接動かしてみる
直接Omnisharpを動かして確認してみます。
```
cd ~/.emacs.d/.cache/lsp/omnisharp-roslyn/latest
./Omnisharp.dll
```
するとエラー内容を確認できました！
```
./Omnisharp
A fatal error occurred. The required library libhostfxr.dylib could not be found.
If this is a self-contained application, that library should exist in [/Users/s-katada/.dotfiles/.emacs.d/.cache/lsp/omnisharp-roslyn/latest/].
If this is a framework-dependent application, install the runtime in the global location [/usr/local/share/dotnet/x64] or use the DOTNET_ROOT environment variable to specify the runtime location or register the runtime location in [/etc/dotnet/install_location].

The .NET runtime can be found at:
  - https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=arm64&rid=osx.11.3-arm64&apphost_version=6.0.0-preview.7.21317.1
```
Omnisharpが.NET Coreのバイナリ場所を理解してなさそうです
片田はasdfで.NET Coreをインストールしているので、`/usr/local/share/dotnet/x64`に.NET Coreは存在しません

### 解決策
環境変数DOTNET_ROOTに.NET Coreのバイナリパスを渡すことで解決できました！

片田の場合
```
export DOTNET_ROOT="/Users/s-katada/.asdf/installs/dotnet-core/8.0.203"
```

### 動作確認
無事動作しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702975/24a69a61-a2cb-0439-e6f8-101b60a5349a.png)

### まとめ
- lsp-install-serverからインストールはできなかったが、手動でインストールして動作させることができました

- brewで.NET Coreをインストールしていればこの問題は起きなかったかもしれないです(バージョンを管理できないので嫌)

ベストプラクティスではないと思いますが、参考になれば幸いです！