Files
TEngine/Assets/GameScripts/DotNet/Core/Helper/ProcessHelper.cs
ALEXTANG 336d4b2eb9 [+] 接入ET8服务端
[+] 接入ET8服务端
2023-07-13 12:23:48 +08:00

109 lines
3.3 KiB
C#

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Path = System.IO.Path;
namespace ET
{
public static class ProcessHelper
{
public static System.Diagnostics.Process Run(string exe, string arguments, string workingDirectory = ".", bool waitExit = false)
{
//Log.Debug($"Process Run exe:{exe} ,arguments:{arguments} ,workingDirectory:{workingDirectory}");
try
{
bool redirectStandardOutput = true;
bool redirectStandardError = true;
bool useShellExecute = false;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
redirectStandardOutput = false;
redirectStandardError = false;
useShellExecute = true;
}
if (waitExit)
{
redirectStandardOutput = true;
redirectStandardError = true;
useShellExecute = false;
}
ProcessStartInfo info = new ProcessStartInfo
{
FileName = exe,
Arguments = arguments,
CreateNoWindow = true,
UseShellExecute = useShellExecute,
WorkingDirectory = workingDirectory,
RedirectStandardOutput = redirectStandardOutput,
RedirectStandardError = redirectStandardError,
};
System.Diagnostics.Process process = System.Diagnostics.Process.Start(info);
if (waitExit)
{
WaitExitAsync(process).Coroutine();
}
return process;
}
catch (Exception e)
{
throw new Exception($"dir: {Path.GetFullPath(workingDirectory)}, command: {exe} {arguments}", e);
}
}
private static async ETTask WaitExitAsync(System.Diagnostics.Process process)
{
await process.WaitForExitAsync();
#if UNITY
Log.Info($"process exit, exitcode: {process.ExitCode} {process.StandardOutput.ReadToEnd()} {process.StandardError.ReadToEnd()}");
#endif
}
#if UNITY
private static async Task WaitForExitAsync(this System.Diagnostics.Process self)
{
if (!self.HasExited)
{
return;
}
try
{
self.EnableRaisingEvents = true;
}
catch (InvalidOperationException)
{
if (self.HasExited)
{
return;
}
throw;
}
var tcs = new TaskCompletionSource<bool>();
void Handler(object s, EventArgs e) => tcs.TrySetResult(true);
self.Exited += Handler;
try
{
if (self.HasExited)
{
return;
}
await tcs.Task;
}
finally
{
self.Exited -= Handler;
}
}
#endif
}
}