Ответ 1
Я смог воспроизвести вашу проблему. У меня не было доступа к C, поэтому я использовал C++ в Visual Studio 2013. Похоже, что С# с использованием StartInfo передает аргументы в виде символов Unicode, поэтому первый байт отличен от нуля, тогда как 2-й байт, скорее всего, 0 бит в результате отображается только первый символ, так как это указывает на символ окончания строки. Когда я использовал printf, это не сработало, мне пришлось использовать _tprintf, чтобы узнать, что передано. И printf не обрабатывает Unicode. Мало того, что printf не обрабатывает его, ваша программа C при заполнении argv не переводит Unicode в строку с использованием 1 байтового символа. Хотя TCHAR (широкий символ) и tprintf в C++, как и С# изначально.
Итак, когда вы сделали это другим способом, используя "cmd.exe" для вызова "/C Demo.exe один два три", cmd не передавал строку как Unicode. Это моя гипотеза, учитывая результаты, которые я получаю.
Связанный вопрос о StackOverflow
Код C++, который правильно отображал аргументы (tprintf) и неверно (printf)
#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);
}
}
}
Только для информационных целей, С#, вызывающий С#, также работал. Опять же, подозреваемая причина заключается в том, что С# передает аргументы вашей программе на C как символы Unicode.
Код С#, который работает как запрограммированный вызов.
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();
}
}
}