使用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作为一个字符串接收,但忽略路径中第一个\之后的所有内容?
编辑:我在下面添加了答案。这是一种解决方法,但我不确定问题的原因。
答案 0 :(得分:4)
我今天已经回到这里并且有一个解决方法正在运作。我不明白为什么我原来的尝试没有用。
这是命令行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
有没有人有任何想法为什么第一种方法不起作用?
答案 1 :(得分:3)
我能够重现你的问题。我没有访问C,所以我在Visual Studio 2013中使用了C ++。看来C#使用 StartInfo 将参数传递为 Unicode 字符,所以第一个字节非零,而第二个字节可能是0位,导致仅显示第一个字符,因为它表示字符串终止字符。当我使用printf它不起作用时,我不得不使用_tprintf来查看传递的内容。而printf不处理 Unicode 。 printf不仅无法处理它,填充 argv 时,您的C程序不会将 Unicode 转换为使用1个字节字符的字符串。虽然C ++中的TCHAR(宽字符)和tprintf确实如此,但C#本身也是如此。
所以,当你以另一种方式做到这一点时,使用&#34; cmd.exe&#34; 来调用&#34; / C Demo.exe一两三&#34 ; cmd未将字符串作为 Unicode 传递。鉴于我得到的结果,这是我的假设。
StackOverflow上的相关问题
正确显示参数(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();
}
}
}
答案 2 :(得分:-1)
试试这个
Arguments = "\"arg1\" \"arg2\" \"arg3\"";