Closed KisaragiEffective closed 9 months ago
常体で失礼します
related: #20
11/11時点のHEADである01b8ebc83574aeb0f2e50100bee60a3092aae31dをチェックアウトし、手元でコンパイルして引数を与えずに動かそうと試みたが、実行時に次のようなエラーが出た。
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で下記コードを使用して現在動作しているプロセスの全列挙を試みた。
DebuggerSession.cs
ConnectAllUnityProcesses
foreach (var p in Process.GetProcesses()) { Console.WriteLine($"{p.Id}: {p.ProcessName}"); }
その結果、PID41026で動作しているUnityに対して次の結果が得られた。
41026
41026: Main Thread
しかし、cut -d '' -f1 /proc/41026/cmdlineをした結果は次のようになり、C#の結果とは異なる。
cut -d '' -f1 /proc/41026/cmdline
/home/kisaragi/Unity/Hub/Editor/2019.4.31f1/Editor/Unity
Linuxにはprocfs (FHS 3.0 / kernel.org)という実行中のプロセスを得るための擬似的なファイルシステムが/procとしてマウントされている。 それを呼び出すと次のようなコードになる。
/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]は実行ファイルのフルパスを得ている。
Split('\0')
main
argv
[0]
ConsoleLogSaver.Cli.csprojを次のように編集した:
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>
しかし、この変更のみで再コンパイルしても症状が解消することはなかった。
dotnet/runtimeにissue投げても良さそうではありますね。一応Workaround入れときます。
常体で失礼します
related: #20
11/11時点のHEADである
01b8ebc83574aeb0f2e50100bee60a3092aae31d
をチェックアウトし、手元でコンパイルして引数を与えずに動かそうと試みたが、実行時に次のようなエラーが出た。検証のため、
DebuggerSession.cs
内のConnectAllUnityProcesses
で下記コードを使用して現在動作しているプロセスの全列挙を試みた。その結果、PID
41026
で動作しているUnityに対して次の結果が得られた。しかし、
cut -d '' -f1 /proc/41026/cmdline
をした結果は次のようになり、C#の結果とは異なる。提案するワークアラウンド
Linuxにはprocfs (FHS 3.0 / kernel.org)という実行中のプロセスを得るための擬似的なファイルシステムが
/proc
としてマウントされている。 それを呼び出すと次のようなコードになる。ここで、
Split('\0')
はC言語のmain
で与えられるargv
の各項目を切り離すために必要であり、[0]
は実行ファイルのフルパスを得ている。検討した解決策
.NET 7にアップグレードする
ConsoleLogSaver.Cli.csproj
を次のように編集した:しかし、この変更のみで再コンパイルしても症状が解消することはなかった。