Como inicio um programa com argumentos durante a depuração?


109

Quero depurar um programa no Visual Studio 2008. O problema é que ele sai se não obtiver argumentos. Este é o 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);
}

Não quero comentar e voltar a fazer a compilação. Como posso iniciar o programa com argumentos durante a depuração? É definido como Projeto de inicialização.



Respostas:


170

Vá para Project-><Projectname> Properties. Em seguida, clique na Debugguia e preencha seus argumentos na caixa de texto chamada Command line arguments.


1
Os argumentos podem (devem?) Ser preenchidos no Command line argumentsespaço separado (como você faria, usando a linha de comando). Não tenho certeza se existem outras maneiras, mas talvez você possa adicionar isso à sua resposta.
d4Rk 01 de

2
Há uma semana que procuro esta resposta! Obrigado!
bird2920

Não se esqueça das marcas de fala em torno de argumentos de comando contendo espaços, que me pegaram.
Dale

É possível usar parâmetros nomeados para quando usar bibliotecas como analisador de linha de comando? por exemplo, como posso passar algo parecido -url https://google.com -p pass -u user?
Animesh

54

Eu sugeriria usar as diretivas como a seguinte:

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

            Console.WriteLine(args[0]);
        }

Boa sorte!


2
Ambas as respostas boas, eu gosto mais disso apenas porque é mais fácil de alterar ou fazer referência (embora não seja necessariamente um incômodo percorrer as propriedades: p, talvez um clique extra do mouse ou algo assim)
Andrew Jackman

Eu vou olhar para isso. Obrigado.
Kasper Hansen

1
Eu concordo com a Solução de Homam. Embora para um programa pequeno, definir as Propriedades do projeto -> Os argumentos da linha de comando da guia Depurar é uma maneira mais direta e fácil de depurar, pois os aplicativos grandes usando as diretivas são mais úteis e elegantes.
Sabitha

Ambas as soluções são perfeitas. mas eu meio que prefiro a solução de Homam. Seu elegante não precisa mexer nos arranjos do projeto que se pode esquecer de cuidar. Em um segundo pensamento, também podemos esquecer as alterações feitas no código, mas elas são pelo menos "visíveis".
IUnknown

4
Omho esta resposta é a resposta. É uma tarefa tediosa editar as configurações do projeto toda vez que você deseja depurar com um novo conjunto de parâmetros de linha de comando. Quando está escrito assim, você pode simplesmente escrever todos os casos de teste que deseja verificar e apenas alternar os comentários em cada um para ativá-los. Muito mais rápido e especialmente útil se você de repente estiver na frente de um Visual Studio em um idioma diferente (não aquele com o qual está acostumado a trabalhar), que é exatamente o meu caso e embora eu saiba o idioma, a tradução é horrível e até mesmo um falante nativo não consegue lidar com isso adequadamente. : D
rbaleksandar

6

Minha sugestão seria usar testes de unidade.

Em seu aplicativo, faça as seguintes opções Program.cs:

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

e o mesmo para static Main(string[] args) .

Ou, alternativamente, use Friend Assemblies adicionando

[assembly: InternalsVisibleTo("TestAssembly")]

para o seu AssemblyInfo.cs .

Em seguida, crie um projeto de teste de unidade e um teste mais ou menos assim:

[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);
        }
    }
}

Dessa forma, você pode, de forma automatizada, testar várias entradas de argumentos sem ter que editar seu código ou alterar uma configuração de menu toda vez que quiser verificar algo diferente.


3

Vim para esta página porque tenho informações confidenciais em meus parâmetros de linha de comando e não queria que eles fossem armazenados no repositório de código. Eu estava usando variáveis ​​de ambiente de sistema para manter os valores, que podiam ser definidos em cada máquina de construção ou desenvolvimento conforme necessário para cada propósito. A Expansão de Variáveis ​​de Ambiente funciona muito bem em processos Shell Batch, mas não no Visual Studio.

Opções de inicialização do Visual Studio:

Opções de inicialização do Visual Studio

No entanto, o Visual Studio não retornaria o valor da variável, mas o nome da variável.

Exemplo de problema:

Exemplo de erro no Visual Studio

Minha solução final depois de tentar vários aqui no SO foi escrever uma pesquisa rápida para a variável de ambiente em meu processador de argumentos. Eu adicionei uma verificação de% no valor da variável de entrada e, se for encontrado, pesquise a Variável de ambiente e substitua o valor. Isso funciona no Visual Studio e no meu ambiente de compilação.

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("%", ""));
                    }

Isso me permite usar a mesma sintaxe em meus arquivos de lote de amostra e na depuração com Visual Studio. Nenhuma informação de conta ou URLs salvos no GIT.

Exemplo de uso em lote

Exemplo de arquivo em lote


1

Para código do Visual Studio :

  • Abrir launch.jsonarquivo
  • Adicione args à sua configuração:

"args": ["algum argumento", "outro"],

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.