DllNotFoundException: Unable to load DLL

unityでタイトルのようなエラーが出たので調べた内容をメモ。

該当のファイルを確認すると確かに存在していたがファイルサイズが明らかに小さすぎる。なので中身を確認するとgit lfsのメタファイルになっていた。こういうやつ。

version https://git-lfs.github.com/spec/v1
oid sha256:44a8486abdf0330a3fe6b586e407506e738fe075fe0b5dfc43961e358fda7206
size 2684586

Unity - Manual: Log files

ドキュメントに従ってpackage managerのログを見てみる

# ~/Library/Logs/Unity/upm.log
[ERROR] Error when executing Git command:
git lfs pull --include <package path>
- message: `/usr/bin/git lfs pull --include <package path>` failed with code 1

- stderr: git: 'lfs' is not a git command. See 'git --help'.
...

lfsが見つからないという状態だった。

気になるのは /usr/bin/git を呼んでいる点。おそらくpackage managerには自分のシェルで設定しているPATHは通ってないので、デフォルトのものを参照していると考えられる。

ちなみに自分のシェルで確認するとちゃんとlfsもインストールされてるように見える。

$ /usr/bin/git lfs version   
git-lfs/3.2.0 (GitHub; darwin arm64; go 1.18.2)

しばらく考えつついろいろ見てると、brewでインストールしたgitも同じversionのlfsを使っていることに気づく。

$ /opt/homebrew/bin/git lfs version
git-lfs/3.2.0 (GitHub; darwin arm64; go 1.18.2)

/opt/homebrew/binにPATHを通さずに実行してみると

$ /usr/bin/git lfs version   
git: 'lfs' is not a git command. See 'git --help'.

ということで、gitコマンド内でPATHを参照してlfsにアクセスしているということだった。なのでPATHの設定がされていないpackage managerだと当然見つからない。

ここでようやく気づいたが、git lfsはgit-lfsという実体を呼んでいるだけだった。でgit-lfsbrewでインスールしてあるので/opt/homebrew/binにある。

よって以下のどちらかで解決できそう

  • package managerにbrewのpathを通す
  • デフォルトで通ってるpathにgit-lfsを置く

一つ目の方法を少し調べてみたがこのようなFAQが見つかった

環境変数を設定した状態で Unity を起動するにはどうすればいいですか? – Unity

wrapperスクリプトを書いて呼び出せとのこと。それは面倒なので2つ目の方法でとりあえず解決することに。

.zprofileや.zshrcなどの設定ファイルを除いてから起動したシェルでPATHを確認するとこうなっていた。

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

なので/usr/local/binシンボリックリンクを貼っておく。

ln -s /usr/local/bin/git-lfs /opt/homebrew/bin/git-lfs

これでupm.logのエラーは出なくなり、dllは正しく解決されて実体がダウンロードできた。

ちなみにapple siliconの場合に/opt/homebrew/binが使われるのはrosetta2との共存のためとのこと。

FAQ — Homebrew Documentation

intel macの場合、デフォルトでbrew/usr/local/binシンボリックリンクを貼ってくれていたために労せず動いてたということだった。 apple silicon対応のために/usr/local/binはrosseta2用になったのでシンボリックリンクは貼られず、今回のようなことが起きるということがわかった。

他のツール利用時でもこれと同じことに引っかかるのは目に見えてるので今度あればこのあたりを疑ってみることにする。