[Información de contexto]
Así que instalé el nuevo Visual Studio 2022 y decidí probar .NET Core 6 para obtener un script simple. En primer lugar, creé una nueva aplicación de consola y me confundí de inmediato. Sin método principal, sin escribir en la documentación para usar argumentos CLI (necesito pasar dos argumentos de ruta de destino). Encontré una publicación de desbordamiento sobre cómo acceder a los argumentos a través de la clase System.Environment. Así que seguí adelante.
[Pregunta]
En las aplicaciones de consola .NET Core 5, no tuve problemas para ejecutar ejecutables compilados con argumentos a través de la CLI. Pero cuando publiqué mi código y lo ejecuté a través de la línea de comando, obtuve el siguiente resultado (ver resultado) con la línea extraña "el programa no puede ejecutarse en modo DOS". Curiosamente, todavía lee uno de los archivos ini, pero cuando ejecuto powershell, lee el otro archivo ini. Este es un comportamiento muy extraño para mí. ¿Debería volver a cambiar a .NET Core 5 o tratar de entender lo que está sucediendo? ¿Es el hecho de que estoy leyendo INI? (lamentablemente no tengo otra opción ya que es un proyecto heredado). Cualquier ayuda es apreciada.
[Código]
using System.IO; //get command line arguments try { string stationIniPath = Environment.GetCommandLineArgs()[0]; string equipmentIniPath = Environment.GetCommandLineArgs()[1]; Console.WriteLine("- Reading INI data -"); if(stationIniPath != null && equipmentIniPath != null){ string[] stationINI = System.IO.File.ReadAllLines(stationIniPath); string[] equipmentINI = System.IO.File.ReadAllLines(equipmentIniPath); foreach(string station in stationINI) { Console.WriteLine(station); } foreach(string equipment in equipmentINI) { Console.WriteLine(equipment); } } else { throw new Exception("Need to specify command line arguments"); } } catch (Exception e) { Console.WriteLine("You must specify arguments [0] Station INI Path and [1] Equipment INI path : " + e.Message); }Environment.GetCommandLineArgs() siempre tiene el nombre del archivo de proceso como primer elemento. Debe comenzar desde el índice 1.
Otro enfoque: use el parámetro args generado por el compilador:
El método de punto de entrada siempre tiene un parámetro formal,
string[] args. El entorno de ejecución crea y pasa un argumentostring[]que contiene los argumentos de la línea de comandos que se especificaron cuando se inició la aplicación. El argumentostring[]nunca es nulo, pero puede tener una longitud de cero si no se especificaron argumentos de línea de comandos. El parámetroargsestá dentro del alcance de las declaraciones de nivel superior y no está dentro del alcance fuera de ellas. Se aplican las reglas habituales de conflicto de nombres/sombreado.
string stationIniPath = args[0]; string equipmentIniPath = args[1];