我正在尝试从另一个运行一个.NetCore程序。
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "sh";
psi.Arguments = "-c dotnet /home/myuser/PublishOutput/myprogram.dll";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
Process proc = new Process
{
StartInfo = psi
};
proc.Start();
string error = proc.StandardError.ReadToEnd();
if (!string.IsNullOrEmpty(error))
return "error: " + error;
string output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
return output;
作为输出我得到:
Microsoft .NET核心共享框架主机
版本:1.1.0构建: 928f77c4bc3f49d892459992fb6e1d5542cb5e86
用法:dotnet [common-options] [[options] path-to-application]
常用选项: - help显示.NET Core 共享框架主机帮助。 --version显示 .NET核心共享框架主机版本。
选项: - fx-version已安装的版本 用于运行应用程序的共享框架 --additionalprobingpath包含要探测的探测策略和程序集的路径。
应用程序的路径:.NET Core托管应用程序的路径, 要执行的dll或exe文件。
如果您正在调试共享框架主机,请设置' COREHOST_TRACE' 到' 1'在你的环境中。
要开始为.NET Core开发应用程序,请安装 SDK来自:http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
所以我似乎非常喜欢运行命令 dotnet 而没有dll路径参数。
答案 0 :(得分:3)
您需要将参数转义为-c
,以便它是一个参数:
psi.Arguments = "-c \"dotnet /home/myuser/PublishOutput/myprogram.dll\"";
答案 1 :(得分:1)
如果您想从您的 c# .net 核心应用程序中使用特定命令(例如 find / -name image.png
)运行 Linux 程序,您可以使用以下代码段:
try
{
var process = new Process();
var processStartInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = $"/bin/bash",
WorkingDirectory = workingDirectory = "/mnt",
Arguments = $"-c \"find / -name image.png\"",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
};
process.StartInfo = processStartInfo;
process.Start();
String error = process.StandardError.ReadToEnd();
String output = process.StandardOutput.ReadToEnd();
}
catch(Exception ex)
{
//_logger.LogError(ex.Message, ex);
throw;
}
参数说明:
-c
是必须的,如 manpage 中所写:
-c 字符串
如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。
答案 2 :(得分:0)
我进行了一些更改并使消息可以同步输出
using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace ExecuteCommandX
{
/// <summary>
/// sample by linkanyway@gmail.com
/// </summary>
/// <param name="args"></param>
internal static class Program
{
/// <summary>
///
/// </summary>
/// <param name="args"></param>
// ReSharper disable once UnusedParameter.Local
private static void Main(string[] args)
{
var psi = new ProcessStartInfo
{
FileName = "ping",
Arguments = "-c 3 8.8.8.8",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
var proc = new Process
{
StartInfo = psi
};
proc.Start();
Task.WaitAll(Task.Run(() =>
{
while (!proc.StandardOutput.EndOfStream)
{
var line = proc.StandardOutput.ReadLine();
Console.WriteLine(line);
}
}), Task.Run(() =>
{
while (!proc.StandardError.EndOfStream)
{
var line = proc.StandardError.ReadLine();
Console.WriteLine(line);
}
}));
proc.WaitForExit();
Console.WriteLine(proc.ExitCode);
}
}
}