You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#项目内嵌exe文件调用无输出问题求助

解决方案:C#项目内调用外部EXE并获取输出

问题核心原因

当EXE放在项目目录内时,无输出的常见诱因包括:

  • EXE依赖的辅助库未同步复制到输出目录(比如ideviceinfo.exe需要的libimobiledevice相关动态库)
  • 进程工作目录未指向EXE所在路径,导致EXE无法加载依赖或读取必要文件
  • 未捕获标准错误输出,EXE执行出错但错误信息未被获取

具体解决步骤

  1. 同步EXE及依赖文件到输出目录

    • 在Visual Studio中,将ideviceinfo.exe及其所有依赖的.dll文件添加到C#项目
    • 选中这些文件,在属性窗口设置复制到输出目录为如果较新则复制或始终复制
  2. 配置正确的进程工作目录与EXE路径

    • 用项目输出目录作为工作目录,避免硬编码绝对路径
    • 通过AppDomain.CurrentDomain.BaseDirectory获取程序运行时的根目录,拼接EXE的相对路径
  3. 捕获标准错误输出

    • 开启RedirectStandardError=true,同时读取标准错误流,排查EXE执行时的潜在错误

修改后的代码示例

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

public void GetDeviceInfo()
{
    // 获取程序运行的根目录(如Debug/Release文件夹)
    string exeDirectory = AppDomain.CurrentDomain.BaseDirectory;
    string exePath = Path.Combine(exeDirectory, "ideviceinfo.exe");

    var proc = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = exePath,
            Arguments = "-s",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true, // 开启错误输出捕获
            CreateNoWindow = true,
            WorkingDirectory = exeDirectory // 设置工作目录为EXE所在路径
        }
    };

    proc.Start();

    // 异步读取错误输出,避免阻塞主线程
    Task<string> errorTask = proc.StandardError.ReadToEndAsync();
    
    // 读取标准输出并打印
    while (!proc.StandardOutput.EndOfStream)
    {
        string line = proc.StandardOutput.ReadLine();
        Console.WriteLine(line);
    }

    // 打印错误信息(如果存在)
    string errorOutput = await errorTask;
    if (!string.IsNullOrEmpty(errorOutput))
    {
        Console.WriteLine("错误信息:");
        Console.WriteLine(errorOutput);
    }

    proc.WaitForExit();
}

内容的提问来源于stack exchange,提问作者Mega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:10:27