我正在编写一个启动C#控制台应用程序的AIR应用程序,他们需要进行通信.我想为此使用标准输入/标准输出,但我似乎无法使其工作.
当C#应用程序从标准输入获取输入时,它应该通过标准输出将其发回,如果它收到"退出",则退出.我可以从命令行测试它,它可以正常工作.当我从AIR发送字符串时,我没有得到C#应用程序的响应.
我在发布C#应用程序时发送了一个参数,我确实得到了响应,所以我的AIR应用程序至少能够从标准输出接收消息,它只是标准输入无法正常工作.当我通过standardInput从AIR发送消息时,当我发送密钥代码时,我得到一个bytesLoaded = 3的progress事件,当我发送"exit"命令时,bytesLoaded = 5.
这是C#代码:
static void Main(string[] args)
{
if (args.Length > 0)
{
Console.WriteLine(args[0]);
}
while (true)
{
string incoming = Console.ReadLine();
string outgoing = "received: " + incoming;
Console.WriteLine(outgoing);
if (incoming == "exit")
return;
}
}
Run Code Online (Sandbox Code Playgroud)
这是AS3代码:
private function init(e:Event=null):void {
this.removeEventListener(Event.ADDED_TO_STAGE, init);
NativeApplication.nativeApplication.addEventListener(Event.EXITING, onAppClose);
var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var file:File = File.applicationDirectory.resolvePath("test.exe");
info.executable = file;
process = new NativeProcess();
info.arguments.push("native process started");
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
process.addEventListener(ProgressEvent.STANDARD_INPUT_PROGRESS, onInputProgress);
process.addEventListener(Event.STANDARD_OUTPUT_CLOSE, onOutputClose);
process.addEventListener(Event.STANDARD_ERROR_CLOSE, onErrorClose);
process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, onIOError);
process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
process.start(info);
}
private function onKeyUp(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.ESCAPE)
process.standardInput.writeUTFBytes("exit\n");
else {
var msg:String = e.keyCode + "\n";
process.standardInput.writeUTFBytes(msg);
}
}
private function onOutputData(e:ProgressEvent):void {
var data:String = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);
trace("Got: ", data);
}
Run Code Online (Sandbox Code Playgroud)
几个月前我遇到了这个问题,但我从未解决过它,因为我只是使用命令行参数。我刚刚回到它,因为我很想知道发生了什么。
我现在发现以 .NET 3.5 或更早版本为目标可以让它按我的预期工作。切换回 v4.0,我在 stdin 上一无所获。我不确定问题出在哪里,但是如果您可以使用 v3.5,那么它可能是您的解决方案。