mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
109 lines
3.3 KiB
C#
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
|
|
}
|
|
} |