Process.Start()启动的应用程序没有得到参数

使用C#,我试图使用Process.Start()将命令行参数传递给新进程:

string path = @"C:\Demo\Demo.exe"; string arguments = "one two three"; ProcessStartInfo startInfo = new ProcessStartInfo { FileName = path, Arguments = arguments }; var process = Process.Start(startInfo); 

我的C应用程序Demo.exe只是回显命令行参数:

 int main( int argc, char *argv[] ) { int count=0; // Display each command-line argument. printf( "\nCommand-line arguments:\n" ); for( count = 0; count < argc; count++ ) printf( " argv[%d] %s\n", count, argv[count] ); while(1); } 

如果我从cmd.exe启动我的应用程序,我得到合理的输出:

 Command-line arguments: argv[0] Demo.exe argv[1] one argv[2] two argv[3] three 

当我使用C#应用程序时,我唯一得到的是argv [0]中的path参数:

 Command-line arguments: argv[0] C: 

任务管理器显示启动Demo.exe的每种方法的命令行参数: 在此处输入图像描述

为什么我的C应用程序不接收来自C#应用程序的命令行参数?

编辑 @hvd建议我使用GetCommandLine()。 这是代码和结果:

 char* ar = GetCommandLine(); printf( "\nGetCommandLine arguments:\n" ); printf(" %s", ar); 

输出:

 GetCommandLine arguments: "C: 

是否有可能C应用程序将args作为一个字符串接收,但忽略了路径中第一个\之后的所有内容?

编辑:我在下面添加了答案。 这是一种解决方法,但我不确定我的问题的原因。

我能够重现你的问题。 我没有访问C,所以我在Visual Studio 2013中使用了C ++。看来使用StartInfo的 C#将参数作为Unicode字符传递,因此第一个字节非零,而第二个字节可能是0位,导致仅显示第一个字符,因为它表示字符串终止字符。 当我使用printf它不起作用时,我不得不使用_tprintf来查看传递的内容。 而且printf不处理Unicode 。 printf不仅不处理它,填充argv时你的C程序不会使用1个字节的字符将Unicode转换为字符串。 虽然C ++中的TCHAR(宽字符)和tprintf确实如此,但C#本身也是如此。

所以,当你以另一种方式做到这一点时,使用“cmd.exe”调用“/ C Demo.exe一两三” cmd没有将字符串作为Unicode传递。 这是我的假设,考虑到我得到的结果。

StackOverflow的相关问题

  • Process.StartInfo.Arguments是否支持UTF-8字符串?

正确显示参数(tprintf)和错误(printf)的C ++代码

 #include "stdafx.h" #include "string.h" int _tmain(int argc, _TCHAR* argv[]) { int count=0; // Display each command-line argument. printf( "\nCommand-line arguments:\n" ); for( count = 0; count < argc; count++ ) //Correct. This statement worked, displaying the arguments //_tprintf( _T(" argv[%d] %s\n"), count, argv[count] ); //Incorrect. Displayed only the first character of each argument //printf( " argv[%d] %s\n", count, argv[count] ); getchar(); return 0; 

}

这是调用它的C#代码

 namespace ProcessPassArguments { class Program { static void Main(string[] args) { string path = @"C:\Temp\Demo.exe"; string arguments = "one two three"; ProcessStartInfo startInfo = new ProcessStartInfo { FileName = path, Arguments = arguments }; var process = Process.Start(startInfo); } } } 

仅供参考,C#调用C#也有效。 可疑的原因是C#将参数作为Unicode字符传递给您的C程序。

作为目标编程的C#代码调用。

 namespace Demo { class Program { static void Main(string[] args) { int i = 0; foreach (string arg in args) { i++; Console.WriteLine("Argument {0}: {1}", i, arg); } Console.ReadLine(); } } } 

我今天回到这里,并有一个解决方法工作。 我不明白为什么我的原始尝试不起作用。

以下是键入Demo.exe和“Demo.exe”之间命令行的不同之处。

 C:\Users\me\Desktop\Work\Builds\Win32>Demo.exe one two three There are 4 arguments. Command-line arguments: argv[0]: Demo.exe argv[1]: one argv[2]: two argv[3]: three C:\Users\me\Desktop\Work\Builds\Win32>"Demo.exe" one two three There are 1 arguments. Command-line arguments: argv[0]: Demo.exe 

Process.Start()调用似乎在做“Demo.exe”变种。

不起作用:

 ProcessStartInfo startInfo = new ProcessStartInfo { FileName = @"Demo.exe", WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32", Arguments = "one two three" }; var process = Process.Start(startInfo); There are 1 arguments. Command-line arguments: argv[0]: C: 

工作:

 ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "cmd.exe", WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32", Arguments = "/C Demo.exe one two three" }; var process = Process.Start(startInfo); There are 4 arguments. Command-line arguments: argv[0]: Demo.exe argv[1]: one argv[2]: two argv[3]: three 

有没有人有任何想法为什么第一种方法不起作用?

试试这个

 Arguments = "\"arg1\" \"arg2\" \"arg3\"";