如何将C#控制台应用的stdio传递至Node.js并捕获其输出?
在C#控制台应用中捕获Node.js脚本及子进程的输出
核心问题原因
NodeJsEngine 默认不会自动将 Node.js 进程的标准输出/错误转发到 C# 控制台,需要显式配置输出重定向并处理对应的输出事件。
解决方案步骤
1. 修改C#代码,配置输出重定向
初始化NodeSettings时开启标准输出/错误的重定向,绑定事件处理函数将捕获到的输出打印到C#控制台:
using Jering.Javascript.NodeJS; using System; class Program { static void Main(string[] args) { var nodeSettings = new NodeSettings { UseBuiltinLibrary = true, RedirectStandardOutput = true, // 开启标准输出重定向 RedirectStandardError = true, // 开启标准错误重定向 OnOutputDataReceived = (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { Console.WriteLine(e.Data); } }, OnErrorDataReceived = (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { Console.Error.WriteLine(e.Data); } } }; using (IJsEngine engine = new NodeJsEngine(nodeSettings)) { engine.ExecuteFile("SpawnServer.js"); // 如需等待Node进程及子进程结束,可添加阻塞逻辑 // engine.WaitForExit(); } } }
2. 调整Node.js脚本的参数与输出逻辑
原脚本中参数拼接存在问题,同时可优化输出确保内容被正确刷新:
const { spawn } = require("child_process"); console.log('Hi'); process.stdout.write("Hi\n"); // 添加换行确保输出被及时flush // 修正参数数组:将命令参数拆分为独立元素 const child = spawn("npx", ["ansible-language-server", "--stdio"], { stdio: 'inherit' // 子进程输出将继承Node.js的标准流,进而被C#端捕获 }); // 可选:监听子进程退出状态 child.on('exit', (code) => { console.log(`子进程退出,代码: ${code}`); });
3. 关键说明
- 开启
RedirectStandardOutput和RedirectStandardError后,Node.js的console.log、process.stdout.write输出会通过对应事件传递到C#控制台。 - 子进程使用
stdio: 'inherit'时,其输出会直接通过Node.js进程的标准流转发,无需额外处理即可被C#捕获。 - 若需要更精细的输出控制,可将子进程
stdio设为['pipe', 'pipe', 'pipe'],手动监听子进程的stdout/stderr并通过process.stdout/process.stderr转发。
内容的提问来源于stack exchange,提问作者sorosh_sabz
相关产品推荐
相关产品推荐

