デバッグ時に引数を指定してプログラムを起動するにはどうすればよいですか?


108

Visual Studio 2008でプログラムをデバッグしたいと思います。問題は、引数を取得しないとプログラムが終了することです。これはmainメソッドからのものです:

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

私はそれをコメントアウトしたくないし、コンパイル時に戻ってきたくない。デバッグ時に引数を指定してプログラムを開始するにはどうすればよいですか?スタートアッププロジェクトとして設定されます。



回答:


169

に移動しProject-><Projectname> Propertiesます。次に、Debugタブをクリックして、というテキストボックスに引数を入力しますCommand line arguments


1
引数は(Command line argumentsコマンドラインを使用して行うように)区切られたスペースに(必須ですか?)他の方法があるかどうかはわかりませんが、これを回答に追加できます。
d4Rk 2015

2
私はこの答えを一週間探していました!ありがとうございました!
bird2920 2017年

スペースを含むコマンド引数の周りのスピーチマークを忘れないでください。
デール、

コマンドラインパーサーなどのライブラリを使用する場合、名前付きパラメーターを使用できますか?たとえば、どのように渡すことができ-url https://google.com -p pass -u userますか?
Animesh

54

次のようなディレクティブを使用することをお勧めします。

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

            Console.WriteLine(args[0]);
        }

幸運を!


2
どちらも良い答えです。変更や参照が簡単なため(これは必ずしもプロパティを通過する手間ではないですが:p、おそらく余分なマウスクリックなど)
Andrew Jackman

これを調べます。ありがとう。
Kasper Hansen

1
Homamのソリューションに同意します。小さなプログラムの場合でも、プロジェクトプロパティ->デバッグタブのコマンドライン引数を設定する方がデバッグがより簡単で簡単な方法ですが、ディレクティブを使用する大規模なアプリケーションの方が便利でエレガントです。
Sabitha、2011年

どちらのソリューションも完璧です。しかし、私はHomamによるソリューションを好む。そのエレガントなものは、プロジェクトの設定をいじくり回す必要はありません。seconfの考えでは、コードの変更を忘れることもありますが、少なくとも "目に見える"ものです。
IUnknown 2011

4
Omhoこの答えはTHE答えです。新しいコマンドラインパラメーターのセットを使用してデバッグするたびにプロジェクト設定を編集するのは、退屈な仕事です。このように記述されている場合は、チェックするすべてのテストケースを書き留め、コメントを切り替えてアクティブ化できます。非常に速く、Visual Studioの前に突然別の言語(作業に使用している言語ではない)で作業している場合に特に便利です。これはまさに私の場合であり、私はその言語を知っていますが、翻訳はひどいです。ネイティブスピーカーでも適切に処理できません。:D
rbaleksandar

6

私の提案は、単体テストを使用することです。

アプリケーションで、次のスイッチを実行しますProgram.cs

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

と同じですstatic Main(string[] args)

または、追加してFriend Assembliesを使用する

[assembly: InternalsVisibleTo("TestAssembly")]

あなたにAssemblyInfo.cs

次に、単体テストプロジェクトと、次のようなテストを作成します。

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

これにより、コードを編集したり、別の項目をチェックするたびにメニュー設定を変更したりすることなく、自動化された方法で引数の複数の入力をテストできます。


3

コマンドラインパラメータに機密情報が含まれていて、コードリポジトリに保存したくないため、このページにアクセスしました。私は、システム環境変数を使用して値を保持していました。これらの値は、各目的で必要に応じて、各ビルドまたは開発マシンで設定できます。環境変数の拡張は、シェルバッチプロセスでは適切に機能しますが、Visual Studioでは機能しません。

Visual Studio起動オプション:

Visual Studio起動オプション

ただし、Visual Studioは変数の値ではなく、変数の名前を返します。

問題の例:

Visual Studioのエラーの例

ここでSOをいくつか試した後の私の最終的な解決策は、引数プロセッサで環境変数のクイックルックアップを記述することでした。入力変数の値に%のチェックを追加し、それが見つかった場合は、環境変数を検索して値を置き換えます。これはVisual Studioと私のビルド環境で動作します。

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

これにより、サンプルバッチファイルとVisual Studioでのデバッグで同じ構文を使用できます。GITに保存されているアカウント情報やURLはありません。

バッチでの使用例

バッチファイルの例


1

以下のためのVisual Studioのコード

  • launch.jsonファイルを開く
  • 構成にargsを追加します。

"args":["ある引数"、 "別の引数"]、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.