¿Cómo inicio un programa con argumentos al depurar?


109

Quiero depurar un programa en Visual Studio 2008. El problema es que se cierra si no obtiene argumentos. Esto es del método principal:

if (args == null || args.Length != 2 || args[0].ToUpper().Trim() != "RM") 
{
    Console.WriteLine("RM must be executed by the RSM.");
    Console.WriteLine("Press any key to exit program...");
    Console.Read();
    Environment.Exit(-1);
}

No quiero comentarlo y luego volver a ingresar al compilar. ¿Cómo puedo iniciar el programa con argumentos al depurar? Está configurado como Proyecto de inicio.



Respuestas:


171

Ir a Project-><Projectname> Properties. Luego haga clic en la Debugpestaña y complete sus argumentos en el cuadro de texto llamado Command line arguments.


1
Los argumentos pueden (¿deben?) Completarse en el Command line argumentsespacio separado (como lo haría, usando la línea de comando). No estoy seguro de si hay otras formas, pero tal vez pueda agregar esto a su respuesta.
d4Rk

2
¡He estado buscando esta respuesta durante una semana! ¡Gracias!
bird2920

No olvides las marcas de habla alrededor de los argumentos de comando que contienen espacios, eso me sorprendió.
Dale

¿Es posible usar parámetros con nombre para cuando se usan bibliotecas como el analizador de línea de comandos? por ejemplo, ¿cómo puedo pasar algo así -url https://google.com -p pass -u user?
Animesh

54

Sugeriría usar las directivas como las siguientes:

        static void Main(string[] args)
        {
#if DEBUG
            args = new[] { "A" };
#endif

            Console.WriteLine(args[0]);
        }

¡Buena suerte!


2
Ambas buenas respuestas, me gusta más solo porque es más fácil de cambiar o hacer referencia (aunque no es necesariamente una molestia pasar por las propiedades: p, tal vez un clic adicional del mouse más o menos)
Andrew Jackman

Voy a mirar en esto. Gracias.
Kasper Hansen

1
Estoy de acuerdo con la solución de Homam. Aunque para un programa pequeño, configurar las Propiedades del proyecto -> Los argumentos de la línea de comandos de la pestaña Depurar es una forma más directa y fácil de depurar, para aplicaciones grandes, las Directivas son más útiles y elegantes.
Sabitha

Ambas soluciones son perfectas. pero prefiero la solución de Homam. Su elegante no necesita jugar con la configuración del proyecto que uno puede olvidarse de cuidar. En segundo lugar, también se pueden olvidar los cambios de código realizados, pero al menos son "visibles".
IUnknown

4
Omho esta respuesta es LA respuesta. Es un trabajo tedioso editar la configuración del proyecto cada vez que desee depurar con un nuevo conjunto de parámetros de línea de comando. Cuando está escrito así, simplemente puede escribir todos los casos de prueba que desea verificar y simplemente alternar los comentarios en cada uno para activarlo. Mucho más rápido y resulta especialmente útil si de repente estás frente a un Visual Studio en un idioma diferente (no en el que estás acostumbrado a trabajar), que es exactamente mi caso y, aunque conozco el idioma, la traducción es horrible y incluso un hablante nativo no puede manejarlo correctamente. : D
rbaleksandar

6

Mi sugerencia sería utilizar pruebas unitarias.

En su aplicación, realice los siguientes cambios Program.cs:

#if DEBUG
    public class Program
#else
    class Program
#endif

y lo mismo para static Main(string[] args).

O, alternativamente, utilice Friend Assemblies agregando

[assembly: InternalsVisibleTo("TestAssembly")]

a tu AssemblyInfo.cs.

Luego, cree un proyecto de prueba unitaria y una prueba que se parezca un poco a esto:

[TestClass]
public class TestApplication
{
    [TestMethod]
    public void TestMyArgument()
    {
        using (var sw = new StringWriter())
        {
            Console.SetOut(sw); // this makes any Console.Writes etc go to sw

            Program.Main(new[] { "argument" });

            var result = sw.ToString();

            Assert.AreEqual("expected", result);
        }
    }
}

De esta manera, puede, de forma automatizada, probar múltiples entradas de argumentos sin tener que editar su código o cambiar una configuración de menú cada vez que desee verificar algo diferente.


3

Vine a esta página porque tengo información confidencial en los parámetros de mi línea de comando y no quería que se almacenaran en el repositorio de código. Estaba usando variables de entorno del sistema para mantener los valores, que podrían establecerse en cada máquina de desarrollo o compilación según sea necesario para cada propósito. La expansión de variables de entorno funciona muy bien en los procesos de Shell Batch, pero no en Visual Studio.

Opciones de inicio de Visual Studio:

Opciones de inicio de Visual Studio

Sin embargo, Visual Studio no devolvería el valor de la variable, sino el nombre de la variable.

Ejemplo de problema:

Ejemplo de error en Visual Studio

Mi solución final después de probar varios aquí en SO fue escribir una búsqueda rápida para la variable de entorno en mi procesador de argumentos. Agregué una verificación de% en el valor de la variable entrante y, si se encuentra, busque la Variable de entorno y reemplace el valor. Esto funciona en Visual Studio y en mi entorno de compilación.

foreach (string thisParameter in args)
            {
                if (thisParameter.Contains("="))
                {
                    string parameter = thisParameter.Substring(0, thisParameter.IndexOf("="));
                    string value = thisParameter.Substring(thisParameter.IndexOf("=") + 1);

                    if (value.Contains("%"))
                    {   //Workaround for VS not expanding variables in debug
                        value = Environment.GetEnvironmentVariable(value.Replace("%", ""));
                    }

Esto me permite usar la misma sintaxis en mis archivos por lotes de muestra y en la depuración con Visual Studio. No hay información de cuenta ni URL guardadas en GIT.

Ejemplo de uso en lote

Ejemplo de archivo por lotes


1

Para el código de Visual Studio :

  • Abrir launch.jsonarchivo
  • Agregue argumentos a su configuración:

"args": ["algún argumento", "otro"],

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.