Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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语言中的StartInfo.Arguments#_C# - Fatal编程技术网

C# c语言中的StartInfo.Arguments#

C# c语言中的StartInfo.Arguments#,c#,C#,我找到了以下代码片段: 使用制度; 使用系统诊断 public class RedirectingProcessOutput { public static void Main() { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/c dir *.cs"; p.StartInfo.UseSh

我找到了以下代码片段:

使用制度; 使用系统诊断

public class RedirectingProcessOutput
{
    public static void Main()
    {
        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.Arguments = "/c dir *.cs";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();

        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();

        Console.WriteLine("Output:");
        Console.WriteLine(output);    
    }
}
但我不知道这是什么
p.StartInfo.Arguments=“/c dir*.cs”正在做什么?提前感谢您的解释

它将传递给即将启动的流程

在这种特殊情况下,进程是Windows shell(
cmd.exe
)。将命令行传递给它将导致它在启动时执行该命令;然后,由于开头的
/c
参数,它将自行终止

因此,如果打开命令提示符并输入传递给将启动的进程的命令
dir*.cs

,进程的输出将与您得到的完全相同

在这种特殊情况下,进程是Windows shell(
cmd.exe
)。将命令行传递给它将导致它在启动时执行该命令;然后,由于开头的
/c
参数,它将自行终止


因此,如果打开命令提示符并输入命令
dir*.cs

该行仅给出该进程的参数,则进程的输出将与您得到的完全相同

那一行只是给了这个过程一个参数

在开始时,was和它的friends接受指向可执行文件的路径和指向参数的变长指针列表。在sane操作系统中,启动的进程接收到一个指向参数列表的点,参数列表的每个字都包含一个指向的指针和单个字符串。Sane Shell解析命令行并填充exec(3)所需的参数列表

您可以看到exec(3)接受的参数列表之间的直接关联:

以及传递到流程入口点的内容:

int main(char*arg[]){…}

其中,
argv[0]
是可执行文件名,
argv[1]
-
argv[n-2]
是单独的参数,
argv[n-1]
是指示参数列表结束的空指针

概念简单,实现简单

CP/M没有这样做(我想是因为内存有限)。它将原始命令行的地址从shell传递给启动的进程,并将其解析留给进程

DOS在1982年作为CP/M的克隆出现,同时将原始命令行的地址交给已启动的进程

Windows从一开始就没有偏离这一模式。Win32
CreateProcess()
函数

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  ...
);
仍然执行相同的操作,将原始命令行传递给程序。当然,C运行时库会或多或少地为您处理命令行解析

因此…在CLR/.Net世界中,由于所有这些历史,并且由于CLR被设计为依赖于Win32 API,您必须向要启动的进程传递完整的命令行。为什么他们不让你传递一个
params字符串[]
,而是让CLR构建命令行,这是微软的开发人员一直关注的问题

构建启动程序所需的命令行很简单。您只需将每个参数连接到一个字符串中,并用一个SP字符分隔参数。轻松点

…直到其中一个参数包含空格或双引号字符(

然后你必须引用一个或所有的参数。这应该很容易,但是由于奇怪的引用规则,有很多边缘条件会让你绊倒

Windows命令行被分解成由空格分隔的单词,可以选择用双引号(
)引用。部分原因是Windows的路径分隔符错误(
\
而不是
/
),引用规则是…拜占庭式的。如果您深入研究Windows CRT源代码(该文件类似于{VisualStudioInstallLocation}\VC\CRT\src\stdargv.c),您将找到命令行解析代码。

开始时,was及其朋友接受可执行文件的路径和指向参数的变长指针列表。在sane操作系统中,启动的进程接收到一个指向参数列表的点,参数列表的每个字都包含一个指向的指针和单个字符串。Sane Shell解析命令行并填充exec(3)所需的参数列表

您可以看到exec(3)接受的参数列表之间的直接关联:

以及传递到流程入口点的内容:

int main(char*arg[]){…}

其中,
argv[0]
是可执行文件名,
argv[1]
-
argv[n-2]
是单独的参数,
argv[n-1]
是指示参数列表结束的空指针

概念简单,实现简单

CP/M没有这样做(我想是因为内存有限)。它将原始命令行的地址从shell传递给启动的进程,并将其解析留给进程

DOS在1982年作为CP/M的克隆出现,同时将原始命令行的地址交给已启动的进程

Windows从一开始就没有偏离这一模式。Win32
CreateProcess()
函数

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  ...
);
仍然执行相同的操作,将原始命令行传递给程序。当然,C运行时库会或多或少地为您处理命令行解析

因此…在CLR/.Net世界中,由于所有这些历史,并且由于CLR被设计为依赖于Win32 API,您必须向要启动的进程传递完整的命令行。为什么他们不让你传递一个
params字符串[]
,而是让CLR构建命令行,这是微软的开发人员一直关注的问题

构建启动程序所需的命令行很简单。您只需将每个参数连接到一个字符串中