Saltar al contenido

La aplicación iniciada por Process.Start() no recibe argumentos

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *