FreeSql.Tools
FreeSql.Tools copied to clipboard
C#使用Process调用cmd命令生成代码时程序异常退出
异常信息: `
Unhandled exception. System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read. at System.ConsolePal.ReadKey(Boolean intercept) at System.Console.ReadKey() at Colorful.Console.ReadKey() at FreeSql.Generator.ConsoleApp..ctor(String[] args, ManualResetEvent wait) in C:\Users\28810\Desktop\github\FreeSql\Extensions\FreeSql.Generator\ConsoleApp.cs:line 331 at FreeSql.Generator.Program.<>c__DisplayClass0_0.<Main>b__0() in C:\Users\28810\Desktop\github\FreeSql\Extensions\FreeSql.Generator\Program.cs:line 16 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) --- End of stack trace from previous location --- at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
`
ExitCode: -532462766
部分代码: `
/// <summary> /// 调用命令 /// </summary> /// <param name="cmd">命令</param> /// <param name="arguments">参数</param> /// <param name="workingDirectory">工作目录</param> /// <returns></returns> async Task<string> CallCmd(string cmd, string arguments = null, string workingDirectory = null) { using var process = GetCmdProcess(arguments, workingDirectory); process.Start(); process.StandardInput.WriteLine($"{cmd.TrimEnd('&')}&exit"); process.StandardInput.AutoFlush = true; var output = await process.StandardOutput.ReadToEndAsync(); var error = process.StandardError.ReadToEnd(); #if DEBUG Console.Write(output); Console.Write(error); #endif process.WaitForExit(); if (!error.IsNullOrWhiteSpace()) throw new ApplicationException(error); return output; } /// <summary> /// 获取进程 /// </summary> /// <param name="arguments">参数</param> /// <param name="workingDirectory">工作目录</param> /// <returns></returns> Process GetCmdProcess(string arguments, string workingDirectory = null) { var process = new Process(); process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.RedirectStandardInput = true; //process.StartInfo.StandardInputEncoding = new UTF8Encoding(true); process.StartInfo.RedirectStandardOutput = true; //process.StartInfo.StandardOutputEncoding = new UTF8Encoding(true); process.StartInfo.RedirectStandardError = true; //process.StartInfo.StandardErrorEncoding = new UTF8Encoding(true); if (Config.CurrentOS == OSPlatform.Windows) process.StartInfo.FileName = "cmd.exe"; else if (Config.CurrentOS == OSPlatform.Linux || Config.CurrentOS == OSPlatform.OSX) process.StartInfo.FileName = Environment.GetEnvironmentVariable("SHELL"); else throw new ApplicationException("不支持在当前操作系统执行此操作."); process.StartInfo.Arguments = arguments; if (!workingDirectory.IsNullOrWhiteSpace()) process.StartInfo.WorkingDirectory = workingDirectory; return process; }
`
方法调用: `
var cmd = "FreeSql.Generator -Razor "D:\RazorTemplates\实体类+特性+导航属性(支持子父级结构).cshtml" -NameSpace "Entitys" -DB "Oracle,user id=;password=;data source=//:1521/ORCL;Pooling=true;Max Pool Size=500;" -Output "D:\Entitys.Project\Time_132805582083134656"";
await CallCmd(cmd, null, AppContext.BaseDirectory);
`
cs类文件全部成功生成了,只是程序退出时会报错。