Bagaimana cara memulai program dengan argumen saat debugging?


109

Saya ingin men-debug program dalam Visual Studio 2008. Masalahnya adalah ia keluar jika tidak mendapatkan argumen. Ini dari metode utama:

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

Saya tidak ingin berkomentar dan kemudian kembali lagi saat kompilasi. Bagaimana saya bisa memulai program dengan argumen saat debugging? Ini ditetapkan sebagai Proyek StartUp.



Jawaban:


171

Pergi ke Project-><Projectname> Properties. Kemudian klik Debugtab, dan isi argumen Anda di kotak teks bernama Command line arguments.


1
Argumen dapat (harus?) Diisi ke dalam Command line argumentsruang yang dipisahkan (seperti yang akan Anda lakukan, menggunakan baris perintah). Saya tidak yakin apakah ada cara lain, tetapi mungkin Anda dapat menambahkan ini ke jawaban Anda.
d4Rk

2
Saya telah mencari jawaban ini selama seminggu! Terima kasih!
burung2920

Jangan lupakan tanda ucapan di sekitar argumen perintah yang mengandung spasi, yang menarik perhatian saya.
Dale

Apakah mungkin menggunakan parameter bernama untuk saat menggunakan pustaka seperti parser baris perintah? misalnya Bagaimana saya bisa lulus sesuatu seperti -url https://google.com -p pass -u user?
Animesh

54

Saya akan menyarankan menggunakan arahan seperti berikut:

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

            Console.WriteLine(args[0]);
        }

Semoga berhasil!


2
Kedua jawaban yang bagus, saya lebih suka ini hanya karena lebih mudah untuk mengubah atau referensi (meskipun tidak selalu merepotkan melalui properti: p, mungkin klik mouse ekstra atau lebih)
Andrew Jackman

Saya akan menyelidiki ini. Terima kasih.
Kasper Hansen

1
Saya setuju dengan Solusi Homam. Meskipun untuk program kecil, menyetel Properti Proyek -> Argumen baris perintah Tab Debug adalah cara yang lebih langsung dan mudah untuk men-debug, untuk aplikasi besar yang menggunakan Direktif lebih membantu dan elegan.
Sabitha

Kedua solusi itu sempurna. tapi, saya lebih suka solusi dari Homam. Keanggunannya tidak perlu mengutak-atik pengaturan proyek yang mungkin lupa dijaga. Dalam sekejap orang mungkin juga lupa perubahan kode yang dibuat tetapi setidaknya "terlihat".
IUnknown

4
Omho jawaban ini adalah jawabannya. Ini adalah pekerjaan yang membosankan untuk mengedit pengaturan proyek setiap kali Anda ingin men-debug dengan seperangkat parameter baris perintah yang baru. Jika ditulis seperti ini, Anda cukup menuliskan semua kasus pengujian yang ingin Anda periksa dan cukup aktifkan komentar di masing-masing untuk mengaktifkannya. Jauh lebih cepat dan terbukti sangat berguna jika Anda tiba-tiba berada di depan Visual Studio dalam bahasa yang berbeda (bukan bahasa yang biasa Anda gunakan), itulah kasus saya dan meskipun saya tahu bahasanya, terjemahannya buruk dan bahkan seorang penutur asli tidak dapat menghadapinya dengan baik. : D
rbaleksandar

6

Saran saya adalah menggunakan Tes Unit.

Dalam aplikasi Anda, lakukan sakelar berikut di Program.cs:

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

dan sama untuk static Main(string[] args).

Atau sebagai alternatif gunakan Sidang Teman dengan menambahkan

[assembly: InternalsVisibleTo("TestAssembly")]

untuk Anda AssemblyInfo.cs.

Kemudian buat proyek pengujian unit dan pengujian yang terlihat seperti ini:

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

Dengan cara ini Anda dapat, secara otomatis, menguji beberapa masukan argumen tanpa harus mengedit kode Anda atau mengubah pengaturan menu setiap kali Anda ingin memeriksa sesuatu yang berbeda.


3

Saya datang ke halaman ini karena saya memiliki informasi sensitif dalam parameter baris perintah saya, dan tidak ingin mereka disimpan dalam repositori kode. Saya menggunakan variabel Lingkungan Sistem untuk menyimpan nilai, yang dapat disetel pada setiap mesin pembangunan atau pengembangan sesuai kebutuhan untuk setiap tujuan. Ekspansi Variabel Lingkungan berfungsi dengan baik dalam proses Batch Shell, tetapi tidak dengan Visual Studio.

Opsi Mulai Visual Studio:

Opsi Mulai Visual Studio

Namun, Visual Studio tidak akan mengembalikan nilai variabel, tetapi nama variabel.

Contoh Masalah:

Contoh kesalahan dalam Visual Studio .NET

Solusi terakhir saya setelah mencoba beberapa di sini di SO adalah menulis pencarian cepat untuk variabel Lingkungan di Prosesor Argumen saya. Saya menambahkan tanda centang untuk% dalam nilai variabel yang masuk, dan jika ditemukan, cari Variabel Lingkungan dan ganti nilainya. Ini berfungsi di Visual Studio, dan di lingkungan Build saya.

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

Ini memungkinkan saya untuk menggunakan sintaks yang sama di file batch sampel saya, dan dalam debugging dengan Visual Studio. Tidak ada informasi akun atau URL yang disimpan di GIT.

Contoh Penggunaan dalam Batch

Contoh File Batch


1

Untuk kode Visual Studio :

  • Buka launch.jsonfile
  • Tambahkan args ke konfigurasi Anda:

"args": ["beberapa argumen", "satu lagi"],

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.