Recuerda que en la informática un problema casi siempere puede tener más de una soluciones, de igual modo mostramos la mejor y más óptimo.
Solución:
He vuelto a esto hoy y tengo una solución que funciona. No entiendo por qué mi intento original no funcionó.
Aquí está la diferencia en la línea de comando entre escribir Demo.exe y “Demo.exe”.
C:UsersmeDesktopWorkBuildsWin32>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:UsersmeDesktopWorkBuildsWin32>"Demo.exe" one two three
There are 1 arguments.
Command-line arguments:
argv[0]: Demo.exe
La llamada Process.Start() parecía estar haciendo la variedad “Demo.exe”.
no funciona:
ProcessStartInfo startInfo = new ProcessStartInfo
FileName = @"Demo.exe",
WorkingDirectory = @"C:UsersmeDesktopWorkBuildsWin32",
Arguments = "one two three"
;
var process = Process.Start(startInfo);
There are 1 arguments.
Command-line arguments:
argv[0]: C:
Funciona:
ProcessStartInfo startInfo = new ProcessStartInfo
FileName = "cmd.exe",
WorkingDirectory = @"C:UsersmeDesktopWorkBuildsWin32",
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
¿Alguien tiene alguna idea de por qué el primer método no funciona?
Pude reproducir tu problema. No tenía acceso a C, así que usé C++ en Visual Studio 2013. Parece que C# usando Información de inicio pasa los argumentos como Unicode caracteres, por lo que el primer byte no es cero, mientras que el segundo byte es probablemente 0 bits, lo que da como resultado que se muestre solo el primer carácter, ya que eso indica el string carácter de terminación. Cuando usé printf no funcionó, tuve que usar _tprintf para ver qué pasaba. Y printf no maneja Unicode. No solo printf no lo maneja, su programa C al completar argv no traducirá Unicode a un string utilizando caracteres de 1 byte. Mientras que TCHAR (char ancho) y tprintf en C++ lo hacen, al igual que C# de forma nativa.
Entonces, cuando lo hiciste de otra manera, usando “cmd.exe” llamar “/C Demo.exe uno dos tres” cmd no estaba pasando el string como Unicode. Esa es mi hipótesis, dados los resultados que estoy obteniendo.
Pregunta relacionada sobre StackOverflow
- ¿Process.StartInfo.Arguments es compatible con UTF-8? string?
El código C++ que muestra los Argumentos correctamente (tprintf) e incorrectamente (imprimir)
#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] %sn"), count, argv[count] );
//Incorrect. Displayed only the first character of each argument
//printf( " argv[%d] %sn", count, argv[count] );
getchar();
return 0;
Este es el código C# que lo llamó
namespace ProcessPassArguments
class Program
static void Main(string[] args)
string path = @"C:TempDemo.exe";
string arguments = "one two three";
ProcessStartInfo startInfo = new ProcessStartInfo
FileName = path,
Arguments = arguments
;
var process = Process.Start(startInfo);
Solo con fines informativos, C# llamar a C# también funcionó. Nuevamente, la causa sospechosa es que C# está pasando los argumentos a su programa C como Unicode Caracteres.
El código C# que funciona como el objetivo programado llamado.
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();
Calificaciones y reseñas
Acuérdate de que tienes concesión de esclarecer tu experiencia si tropezaste tu preocupación en el momento fiel.