将参数传递给 Main(string[] args)

Pass args to Main(string[] args)

我正在尝试构建一个控制台应用程序来启动我构建为 .dll 的 .NetCore Web 应用程序

不幸的是,我的应用程序没有接收到在 ProcessStartInfo 中输入的参数,但是我的应用程序确实启动了,并且我在 Console.WriteLine 方法中遇到了意外行为。

此代码在我的 SocketAPI 项目中,它是一个 .NetCore 2.2 WebApplication | API 项目:

public static void Main(string[] args)
{
    // Outputs -> Received :
    // ?? Why is args.Length empty? Not even 0 or null??
    Console.WriteLine(string.Format("Received : ",args.Length));

    CreateWebHostBuilder(args).Build().Run();
}

它由我的 ProcessRunner 声明和调用,它是一个 Class 保存当前进程:

我也指的是这个文档: dotnet command documentation on microsoft.com

其中描述:dotnet [command] [arguments]

此代码在 ProcessRunner 构造函数中

ProcessStartInfo = new ProcessStartInfo
{
    FileName = "dotnet",
    Arguments = string.Format("BHR.{0}.dll {1}", Name, args),
    WorkingDirectory = ".\",
    UseShellExecute = false,
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true,
};

稍后我将在 ProcessRunner 中调用 Process.Start(); 以启动进程。

如前所述,我确实得到了输出但没有 Args...那么为什么我看到 "Received :" 但最后什么也没有?

我是否必须启用我的 SocketAPI 在将它们作为进程启动时接收参数?从 2 天以来,我一直在尝试处理这个问题,但我完全无能为力...

亲切的问候

在您的代码中,您没有为参数长度添加占位符。

Console.WriteLine(string.Format("Received: {0} ",args.Length));

仅供参考,这对我有用:

var arguments = "myarg1 myarg2";
var dir = @"C:\somedir\somechilddir";

var info = new System.Diagnostics.ProcessStartInfo("dotnet", $"someproject.dll {arguments}");

info.UseShellExecute = false;
info.CreateNoWindow = true;
info.WorkingDirectory = dir;

var process = new System.Diagnostics.Process();
process.StartInfo = info;
process.Start();
process.WaitForExit();

也许,尝试使用 Path.GetFullPath();

解析您的工作目录

非常感谢@AlexanderHiggins 向我展示了我现在应该感到多么乏味!

In your code you are not adding a placeholder for the argument length.

Console.WriteLine(string.Format("Received: {0} ",args.Length));

抱歉打扰了!