カタカタカッターン
今日もクソデカいエンターの打鍵音がオフィスに響く。
ようやくコーディングが終わった。あとはビルドしてテストするだけだ。余計なものがついてこないよう公開ビルドをして……完成だ。
しかし、そのアプリが正常に起動することはなかった――
今回の環境:.NET Core8
使用言語:C#
ビルドエラーは出てないし、どうしたものか
試験者さん「アプリを開いたら落ちます」
付いては落ちるの繰り返し。
何故だろうと調べてみると、自分の環境が .NET Core8だったのに対し、調べた方法が .NET Framework4.8だったのだ! 恐らくアプリケーションを動かすのに必要ななんやらが足りないっぽい。断定はできないが、限りなく怪しい……なんてうっかりさんなんだ。
さて、Core8で調べてはみたが中々上手く行かない。迫る期限。ここは他の策に切り替えた方が良さそうだ……
そこで出てきたのがショートカットを使う方法。なるほど、実行ファイルのショートカットを置いて、実際の実行ファイルはsrcフォルダにまとめてしまえば疑似的な最小ビルドとすることができる。
Apps ┬ exeショートカット
└ src
├ hoge.exe
└ dll等
みたいな感じ
よし、さっそくショートカットを作ってzipに圧縮して試験者に送るぞ!
試験者さん「開けません」
そうだ……ショートカットって絶対パスだからそのままコピーしても参照できないんだ……。
絶対パスがダメなら相対パスにすればいいじゃない
こちらはちょっと調べてみるとすぐに出てきた。
相対パスとは絶対パスと違って「このショートカットから見たパス」なのでどんな環境でも対応できるはず。
%windir%\explorer.exe "src\hoge.exe"
こんな感じで
これで参照できるはず!
試験者さん「開けたけどエラー吐きました」
え……なんで……?
コード内のパスも……
これもちょっと調べてみればすぐにわかる原因だった。
ショートカットを作ったことによる不具合、つまり参照先が見つからないとかが原因だろう。そういえばディレクトリ参照のコードを書いた気が……
Apps - exeショートカット
├ setting
└ src
├ hoge.exe
└ dll等
そう、設定ファイルの存在を忘れていたのだ。設定ファイルのパスは 自分から見た相対位置になっているので、このショートカットを使うとexplorer.exeからの位置になってしまうのだ。つまりこれを 実行ファイルから見た相対位置に直さなければならない。
なにそれどうやるの……?
そうだ、カレントディレクトリを取得すれば……いや、今ここはexplorer.exeになっているので結局同じことだ。
途方に暮れてる中教えてもらった関数は
AppContext.BaseDirectory
これを現在位置として代入して
string path = $"{current}..\\setting.json"
こうしてようやくまともに動くようになったのである――
結論
絶対パスと相対パスはさすがに知っていたが、それがこんな不具合を招くとは想像していなかった。相対パスは場合によって始点が変わってしまうので、こちらから指示してあげる必要があったのだ。
最初からFramework4.8の方が良かったのでは……?
あきらめなければ方法は見つかるものである。頑張ろう。