Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C运行exe文件时,标准输出为空#_C#_Assembly_Process_Exe_Command Prompt - Fatal编程技术网

C# 使用C运行exe文件时,标准输出为空#

C# 使用C运行exe文件时,标准输出为空#,c#,assembly,process,exe,command-prompt,C#,Assembly,Process,Exe,Command Prompt,我的问题可能看起来很直截了当,因为它以前被问过很多次。无论如何,我认为我的情况完全不同,我找不到任何关于它的直觉。我有一个用汇编语言编写的代码编译的exe文件,我想用另一个代码运行这个exe并捕获它的输出。我是用C#完成的,下面是代码: static string runCommand(string command, string args) { if (File.Exists(command)) { Process p = new

我的问题可能看起来很直截了当,因为它以前被问过很多次。无论如何,我认为我的情况完全不同,我找不到任何关于它的直觉。我有一个用汇编语言编写的代码编译的exe文件,我想用另一个代码运行这个exe并捕获它的输出。我是用C#完成的,下面是代码:

static string runCommand(string command, string args)
    {
        if (File.Exists(command))
        {
            Process p = new Process();
            p.StartInfo.FileName = command;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.Arguments = args;
            p.Start();
            p.WaitForExit();
            string output = p.StandardOutput.ReadToEnd();
            return output; 
        }
        return "";
    }
目标exe文件的代码非常简单(我使用的是Irvine库):

其中,command是exe文件路径,args是传递给exe文件的参数(请注意,此exe不需要任何参数)

输出总是等于“”!。当我使用命令提示符运行exe时,控制台输出肯定不是空的。下面是我得到的:

我还尝试使用python捕获控制台输出,但返回的字符串为空

我已经这样做过好几次了,但是exe文件是用C#而不是汇编语言编写的,但是我认为它不应该存在任何差异

编辑

迄今为止尝试的解决方案和哈切特建议的解决方案:

  • 他们都不为我工作

    如果您需要任何进一步的信息,请在评论中告诉我您的C#代码是正确的。捕获控制台进程输出的标准方法是通过将进程对象的
    StartInfo.RedirectStandardOutput
    属性设置为
    true
    ,重定向标准输出,如前所述。这正是你所做的

    例如,问题是您在辅助进程中使用Irvine32库,其
    dumpregs
    的实现调用Win32,而Win32无法重定向。如果尝试重定向标准输出(例如,重定向到管道或文件),则
    WriteConsole
    将失败,并出现
    错误\u无效\u句柄
    ,如下所示:

    ReadConsole
    WriteConsole
    只能与控制台手柄一起使用
    ReadFile
    WriteFile
    可以与其他句柄(如文件或管道)一起使用<如果与已重定向且不再是控制台句柄的标准句柄一起使用,则代码>读控制台和
    写控制台
    将失败

    与rkhb的评论一样,除了文档中的内容外,这也暗示了解决方案。要支持重定向,您需要将
    dumpregs
    的实现更改为call,而不是
    WriteConsole
    。这是一个更通用的函数,可以写入任何类型的句柄,包括标准控制台输出(la
    WriteConsole
    )或您可能将输出重定向到的任何其他类型的对象。完成此更改后,您当然需要重建Irvine32库


    WriteFile
    的唯一显著限制是它不支持像
    writeconole
    那样的Unicode输出,但在您的情况下这不是问题。
    dumpregs
    的输出都是ANSI。

    @hatchet谢谢您的评论。我的问题不是如何使用C#运行exe文件,我已经有了这方面的代码。我的问题是输出总是空的string@hatchet它们对我都不起作用。输出总是空的。你确定输出是标准输出而不是标准错误吗?Irvine的库可以工作,不能重定向。您必须在
    Irvine32.asm
    中将其更改为,将其组装并与
    floatio.obj
    一起构建一个新库。其他注释是正确的。问题不在你的c代码中。如果该程序(调用dumpregs)正常地写入了stdout,那么您的代码就会按原样捕获它。我做了一个快速测试来验证这一点。你完全正确!。我使用WriteFile程序在控制台屏幕上打印。现在,我可以使用C代码捕获输出。非常感谢,先生@谢谢你,先生!
    INCLUDE Irvine32.inc
    
    
    .data
    
    .code
    main proc
        call dumpregs
        exit
    main ENDP
    
    end main