运行 通过 Process.Start 的 Linux 可执行文件给出:执行格式错误

Running a Linux executable via Process.Start gives: Exec format error

我有一个小型 C#/.NET6.0 命令行应用程序,它应该通过 System.Diagnostics.Process.

运行 某个 linux 命令
var processStartInfo = new ProcessStartInfo
{
    FileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"Compressonator/compressonatorcli_linux_x86_64_4.2.5150/compressonatorcli"),
    ArgumentList = { "-fd", compression, "-noprogress", fileName, outputFilename },
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    UseShellExecute = false
};

var process = Process.Start(processStartInfo);
Console.WriteLine(process.StandardOutput.ReadToEnd());
Console.WriteLine(process.StandardError.ReadToEnd());
process.WaitForExit();

然而,这在虚拟机中的 Ubuntu 64 位 运行ning 上出现以下异常失败:

System.ComponentModel.Win32Exception (8): An error occurred trying to start process '/media/sf_imageconverter/net6.0/Compressonator/compressonatorcli_linux_x86_64_4.2.5150/compressonatorcli' with working directory '/media/sf_imageconverter/net6.0'. Exec format error 
   at System.Diagnostics.Process.ForkAndExecProcess(ProcessStartInfo startInfo, String resolvedFilename, String[] argv, String[] envp, String cwd, Boolean setCredentials, UInt32 userId, UInt32 groupId, UInt32[] groups, Int32& stdinFd, Int32& stdoutFd, Int32& stderrFd, Boolean usesTerminal, Boolean throwOnNoExec)
   at System.Diagnostics.Process.StartCore(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)

奇怪的是,当 运行直接从同一台机器上的终端运行进程时,它工作正常:

$/media/sf_imageconverter/net6.0/Compressonator/compressonatorcli_linux_x86_64_4.2.5150/compressonatorcli

进程为https://github.com/GPUOpen-Tools/compressonator/releases/tag/V4.2.5185

我的 .NET6.0 应用程序被设置为编译为 AnyCPU 但我也尝试了其他选项但没有成功。

此错误意味着您启动的不是可执行文件而是脚本。如果你在文本编辑器中打开脚本,你可以看到第二行包含这段代码

#!/bin/bash

这称为 shebang 并指定用于 运行 此脚本的可执行文件。如果您的系统没有 /bin/bash,您将收到此错误消息。

要么确保 bash 可用,要么将该行更改为您用来直接执行脚本的 shell。