Hata ayıklarken bağımsız değişkenlerle bir programı nasıl başlatırım?


110

Visual Studio 2008'de bir programda hata ayıklamak istiyorum. Sorun, argümanlar almazsa çıkmasıdır. Bu ana yöntemden:

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

Bunu yorumlamak ve sonra derlerken geri dönmek istemiyorum. Hata ayıklarken programı bağımsız değişkenlerle nasıl başlatabilirim? Başlangıç ​​Projesi olarak ayarlanmıştır.



Yanıtlar:


173

Adresine gidin Project-><Projectname> Properties. Ardından Debugsekmeye tıklayın ve aranan metin kutusuna argümanlarınızı girin Command line arguments.


1
Bağımsız değişkenler Command line argumentsboşluğa ayrılarak doldurulabilir (zorunlu mu?) (Sizin yaptığınız gibi, komut satırı kullanılarak). Başka yollar var mı emin değilim, ama belki bunu cevabına ekleyebilirsin.
d4Rk

2
Bir haftadır bu cevabı arıyordum! Teşekkür ederim!
bird2920

Beni yakalayan boşluk içeren komut argümanlarının etrafındaki konuşma işaretlerini unutmayın.
Dale

Komut satırı ayrıştırıcısı gibi kitaplıkları kullanırken adlandırılmış parametreleri kullanmak mümkün müdür? ör. gibi bir şeyi nasıl geçebilirim -url https://google.com -p pass -u user?
Animesh

54

Kullanmayı öneririm Direktifleri aşağıdaki gibi :

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

            Console.WriteLine(args[0]);
        }

İyi şanslar!


2
Her iki iyi cevap da, bunu daha çok değiştirmenin veya referans vermenin daha kolay olması nedeniyle seviyorum (her ne kadar özelliklerden geçmek zorunda değilsiniz: p, belki fazladan bir fare tıklaması veya benzeri)
Andrew Jackman

Bunu araştıracağım. Teşekkürler.
Kasper Hansen

1
Homam Çözümüne katılıyorum. Küçük bir program için, Proje Özellikleri -> Hata Ayıklama Sekmesinin Komut satırı bağımsız değişkenlerini ayarlamak hata ayıklamanın daha doğrudan ve kolay bir yoludur, Yönergeleri kullanan büyük uygulamalar için daha yararlı ve zariftir.
Sabitha

Her iki çözüm de mükemmel. ama, Homam'ın çözümünü tercih ediyorum. Şıklığı, dikkat etmeyi unutabileceğiniz proje ayarlarıyla uğraşmak zorunda değil. İkinci bir düşüncede, yapılan kod değişiklikleri de unutulabilir, ancak bunlar en azından "görünür" dir.
IUnknown

4
Omho bu cevap cevaptır. Yeni bir komut satırı parametreleri kümesiyle her hata ayıklamak istediğinizde proje ayarlarını düzenlemek yorucu bir iştir. Bu şekilde yazıldığında, kontrol etmek istediğiniz tüm test senaryolarını yazabilir ve etkinleştirmek için her birinin yorumları arasında geçiş yapabilirsiniz. Çok daha hızlıdır ve aniden farklı bir dilde (birlikte çalışmaya alışkın olduğunuz değil) bir Visual Studio'nun önünde durursanız, bu tam olarak benim durumumdur ve dili bilmeme rağmen, çeviri berbat ve ana dili İngilizce olan biri bile bununla düzgün bir şekilde başa çıkamaz. : D
rbaleksandar

6

Benim önerim Birim Testlerini kullanmak olacaktır.

Uygulamanızda aşağıdaki geçişleri yapın Program.cs:

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

ve aynısı için static Main(string[] args).

Veya alternatif olarak ekleyerek Arkadaş Meclislerini kullanın

[assembly: InternalsVisibleTo("TestAssembly")]

senin için AssemblyInfo.cs.

Ardından bir birim test projesi ve buna benzeyen bir test oluşturun:

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

Bu şekilde, otomatik bir şekilde, kodunuzu düzenlemek zorunda kalmadan veya farklı bir şeyi her kontrol etmek istediğinizde bir menü ayarını değiştirmek zorunda kalmadan, birden çok argüman girişini test edebilirsiniz.


3

Bu sayfaya geldim çünkü komut satırı parametrelerimde hassas bilgilerim var ve bunların kod deposunda saklanmasını istemedim. Değerleri tutmak için Sistem Ortamı değişkenlerini kullanıyordum ve bu değerler, her bir amaç için gerektiği gibi her derleme veya geliştirme makinesinde ayarlanabiliyordu. Ortam Değişken Genişletme, Shell Batch işlemlerinde harika çalışır, ancak Visual Studio'da çalışmaz.

Visual Studio Başlatma Seçenekleri:

Visual Studio Başlatma Seçenekleri

Ancak, Visual Studio değişken değerini döndürmez, ancak değişkenin adını döndürür.

Sorun Örneği:

Visual Studio'da Hata Örneği

Burada SO üzerinde birkaç tane denedikten sonraki son çözümüm, Bağımsız Değişken İşlemcimdeki Ortam değişkeni için hızlı bir arama yazmaktı. Gelen değişken değerine% için bir kontrol ekledim ve bulunursa, Ortam Değişkenini arayın ve değeri değiştirin. Bu, Visual Studio'da ve Derleme Ortamımda çalışır.

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

Bu, örnek toplu iş dosyalarımda ve Visual Studio ile hata ayıklamada aynı sözdizimini kullanmama olanak tanır. GIT'de hiçbir hesap bilgisi veya URL kaydedilmedi.

Toplu İşte Örnek Kullanım

Toplu Dosya Örneği


1

İçin Visual Studio Kodu :

  • launch.jsonDosyayı aç
  • Yapılandırmanıza bağımsız değişkenler ekleyin:

"args": ["bir argüman", "başka bir tane"],

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.