Jak uruchomić program z argumentami podczas debugowania?


110

Chcę debugować program w Visual Studio 2008. Problem polega na tym, że kończy pracę, jeśli nie otrzymuje argumentów. To pochodzi z głównej metody:

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

Nie chcę tego komentować, a potem wracać podczas kompilacji. Jak mogę uruchomić program z argumentami podczas debugowania? Jest ustawiony jako projekt startowy.



Odpowiedzi:


173

Idź do Project-><Projectname> Properties. Następnie kliknij Debugkartę i wprowadź argumenty w polu tekstowym o nazwie Command line arguments.


1
Argumenty można (trzeba?) Wstawić Command line argumentsoddzielając spacje (tak jak zrobiłbyś to za pomocą wiersza poleceń). Nie jestem pewien, czy istnieją inne sposoby, ale może możesz dodać to do swojej odpowiedzi.
d4Rk

2
Szukałem tej odpowiedzi od tygodnia! Dziękuję Ci!
ptak 2920,

Nie zapomnij o znakach mowy wokół argumentów poleceń zawierających spacje, które mnie zaskoczyły.
Dale

Czy można używać nazwanych parametrów podczas korzystania z bibliotek, takich jak parser wiersza poleceń? np. Jak mogę przekazać coś takiego -url https://google.com -p pass -u user?
Animesh

54

Sugerowałbym użycie następujących dyrektyw :

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

            Console.WriteLine(args[0]);
        }

Powodzenia!


2
Obie dobre odpowiedzi, podoba mi się to bardziej tylko dlatego, że łatwiej jest zmienić lub odwołać się (chociaż niekoniecznie jest to kłopotliwe przechodzenie przez właściwości: p, może dodatkowe kliknięcie myszą lub coś podobnego)
Andrew Jackman

Przyjrzę się temu. Dzięki.
Kasper Hansen,

1
Zgadzam się z Homam's Solution. Chociaż w przypadku małego programu ustawienie właściwości projektu -> argumentów wiersza poleceń karty Debuguj jest bardziej bezpośrednim i łatwiejszym sposobem debugowania, w przypadku dużych aplikacji używających dyrektyw są bardziej pomocne i eleganckie.
Sabitha

Oba rozwiązania są doskonałe. ale wolę rozwiązanie Homama. Jego elegancki wygląd nie wymaga majstrowania przy ustawieniach projektu, o które można zapomnieć. Z drugiej strony można zapomnieć o dokonanych zmianach kodu, ale są one przynajmniej „widoczne”.
IUnknown

4
Omho ta odpowiedź jest odpowiedzią. Edycja ustawień projektu za każdym razem, gdy chcesz debugować za pomocą nowego zestawu parametrów wiersza poleceń, jest żmudną pracą. Kiedy jest napisane w ten sposób, możesz po prostu zapisać wszystkie przypadki testowe, które chcesz sprawdzić, i po prostu przełączyć komentarze na każdym z nich, aby go aktywować. Znacznie szybszy i okazuje się szczególnie przydatny, jeśli nagle znajdziesz się przed Visual Studio w innym języku (nie tym, z którym jesteś przyzwyczajony do pracy), co jest dokładnie w moim przypadku i chociaż znam język, tłumaczenie jest okropne i nawet native speaker nie może sobie z tym poradzić. : D
rbaleksandar

6

Moją sugestią byłoby użycie testów jednostkowych.

W swojej aplikacji wykonaj następujące przełączniki w Program.cs:

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

i to samo dla static Main(string[] args) .

Lub alternatywnie użyj zestawów znajomych , dodając

[assembly: InternalsVisibleTo("TestAssembly")]

do twojego AssemblyInfo.cs.

Następnie utwórz projekt testu jednostkowego i test, który wygląda trochę tak:

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

W ten sposób możesz w zautomatyzowany sposób przetestować wiele danych wejściowych argumentów bez konieczności edytowania kodu lub zmiany ustawienia menu za każdym razem, gdy chcesz sprawdzić coś innego.


3

Trafiłem na tę stronę, ponieważ mam poufne informacje w moich parametrach wiersza poleceń i nie chciałem, aby były przechowywane w repozytorium kodu. Używałem zmiennych środowiskowych systemu do przechowywania wartości, które można ustawić na każdej maszynie kompilacji lub programistycznej w zależności od potrzeb. Rozszerzanie zmiennych środowiskowych działa świetnie w procesach Shell Batch, ale nie w programie Visual Studio.

Opcje uruchamiania programu Visual Studio:

Opcje uruchamiania programu Visual Studio

Jednak program Visual Studio nie zwróci wartości zmiennej, ale nazwę zmiennej.

Przykład problemu:

Przykład błędu w programie Visual Studio

Moim ostatecznym rozwiązaniem po wypróbowaniu kilku tutaj na SO było napisanie szybkiego wyszukiwania zmiennej środowiskowej w moim procesorze argumentów. Dodałem sprawdzanie% w przychodzącej wartości zmiennej, a jeśli zostanie znalezione, wyszukaj zmienną środowiskową i zamień wartość. Działa to w programie Visual Studio iw moim środowisku kompilacji.

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

Dzięki temu mogę używać tej samej składni w moich przykładowych plikach wsadowych oraz podczas debugowania w programie Visual Studio. Żadne informacje o koncie ani adresy URL nie są zapisane w GIT.

Przykład użycia w partii

Przykład pliku wsadowego


1

W przypadku kodu programu Visual Studio :

  • Otwórz launch.jsonplik
  • Dodaj argumenty do swojej konfiguracji:

"argumenty": ["jakiś argument", "inny"],

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.