Linux (x86_64) 環境でUnity editorの自動検知に失敗する
Closed this issue · 1 comments
KisaragiEffective commented
常体で失礼します
related: #20
11/11時点のHEADである01b8ebc83574aeb0f2e50100bee60a3092aae31d
をチェックアウトし、手元でコンパイルして引数を与えずに動かそうと試みたが、実行時に次のようなエラーが出た。
Unhandled exception. System.Exception: No UnityEditors found
at Program.<Main>$(String[] args) in /home/kisaragi/RiderProjects/ConsoleLogSaver/ConsoleLogSaver.Cli/Program.cs:line 53
at Program.<Main>(String[] args)
検証のため、DebuggerSession.cs
内のConnectAllUnityProcesses
で下記コードを使用して現在動作しているプロセスの全列挙を試みた。
foreach (var p in Process.GetProcesses())
{
Console.WriteLine($"{p.Id}: {p.ProcessName}");
}
その結果、PID41026
で動作しているUnityに対して次の結果が得られた。
41026: Main Thread
しかし、cut -d '' -f1 /proc/41026/cmdline
をした結果は次のようになり、C#の結果とは異なる。
/home/kisaragi/Unity/Hub/Editor/2019.4.31f1/Editor/Unity
提案するワークアラウンド
Linuxにはprocfs (FHS 3.0 / kernel.org)という実行中のプロセスを得るための擬似的なファイルシステムが/proc
としてマウントされている。
それを呼び出すと次のようなコードになる。
Process.GetProcesses().Where(p => File.ReadAllText($"/proc/{p.Id}/cmdline").Split('\0')[0].EndsWith("Unity"))
.Select(x => x.Id).ToArray();
ここで、Split('\0')
はC言語のmain
で与えられるargv
の各項目を切り離すために必要であり、[0]
は実行ファイルのフルパスを得ている。
検討した解決策
.NET 7にアップグレードする
ConsoleLogSaver.Cli.csproj
を次のように編集した:
diff --git a/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj b/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj
index 156e58a..733169f 100644
--- a/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj
+++ b/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj
@@ -6,7 +6,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
- <TargetFramework>net6.0</TargetFramework>
+ <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishSingleFile>true</PublishSingleFile>
しかし、この変更のみで再コンパイルしても症状が解消することはなかった。
anatawa12 commented
dotnet/runtimeにissue投げても良さそうではありますね。一応Workaround入れときます。