C# 由Process.Start()启动的应用程序是';不要争论
使用C#,我尝试使用process.Start()将命令行参数传递给新进程: 我的C应用程序Demo.exe只是回显命令行参数:C# 由Process.Start()启动的应用程序是';不要争论,c#,process.start,processstartinfo,C#,Process.start,Processstartinfo,使用C#,我尝试使用process.Start()将命令行参数传递给新进程: 我的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++
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);
}
使用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应用程序将参数作为一个字符串接收,但忽略路径中第一个\之后的所有内容
编辑:我在下面添加了一个答案。这是一个解决办法,但我不确定问题的原因。试试这个
Arguments = "\"arg1\" \"arg2\" \"arg3\"";
我今天又回到这里,有一个解决办法。我不明白为什么我最初的尝试没有成功 下面是在命令行中键入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
有人知道为什么第一种方法不起作用吗 我能够重现你的问题。我没有访问C,所以我在Visual Studio 2013中使用C++。似乎C#usingStartInfo将参数作为Unicode字符传递,因此第一个字节为非零,而第二个字节可能为0位,因此仅显示第一个字符,因为这表示字符串终止字符。当我使用printf时,它不起作用,我必须使用tprintf来查看传递了什么。printf不处理Unicode。printf不仅不能处理它,而且在填充argv时,您的C程序不会将Unicode转换为使用1字节字符的字符串。虽然C++中的Tchar(宽char)和tPrTrf都是C,n/p> 因此,当您以另一种方式执行此操作时,使用“cmd.exe”调用“/C Demo.exe一两三”cmd没有将字符串作为Unicode传递。这是我的假设,考虑到我得到的结果 关于堆栈溢出的相关问题
C++代码,正确显示参数<强>(TPRETCF)>和不正确<强>(PrtTf)<强> < /P> 仅出于信息目的,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();
}
}
}
请出示您的C#代码。@JonSkeet C#在上面的第一个代码框中。您还想看其他内容吗?感谢您在此问题中提供了大量信息,这些信息可用于查找问题。当您使用cmd.exe运行此进程时,您是否从与C#应用程序中的应用程序路径相同的目录中执行此操作?我感觉你的C#应用程序无法看到或读取C:\Demo目录。我先用你的代码启动了一个C#控制台应用程序,它显示的参数很好。然后我使用了C++控制台应用程序,它只显示了每个参数的第一个字母,就像你调用的GeCudidLink()中的“C”。然后我意识到,它可能是某种Unicode问题,所以我把我的C++从Prtf改成了TyTrf,以在数组中正确显示Unicode,这就是它对我的作用。当您执行printf时,它将读取第一个字节并显示正确的第一个字符,但下一个字节是0(UTF),因此它认为它是字符串的结尾,因为0为空。不知道第三个解决方案为什么有效,但它确实。。。调用cmd.exe并传递/C somefile.exe somearguments对我也适用。
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
#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;
}
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);
}
}
}
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();
}
}
}