2009-04-08 19 views
0

私は自分自身を解決できないという単純な問題があるようです。私は、mainメソッドは次のようにコマンドライン引数を受け入れるように変更して、のWinFormアプリを持っている:このコードは正常に動作し、次の実行行でデバッグモードでコンパイルしたときargCountが2に等しいされリリースビルドのC#コマンドライン引数の問題

[STAThread] 
    static void Main(String[] args) 
    { 
     int argCount = args.Length; 
    } 

:PROGRAM.EXEを - test.txtファイル。 しかし、リリースモードでプログラムをコンパイルすると、argCountは同じコマンドライン引数で1になります。唯一の引数は "-file test.txt"です。それ以上のことは、obj/Releaseフォルダからコンパイルされた実行可能ファイルを実行するだけですが、bin/Releaseでは実行されません。残念ながら、セットアッププロジェクトはobj/Releaseから実行ファイルを取りますので、変更することはできません。 これは既知の問題ですか?この問題を回避する手段がありますか?

答えて

1

コマンドラインの処理は同じである必要があります。したがって、何か他のことが起こります。私はこのしようとすると:それは私が100%の一貫性のある結果を得るための様々な場所から、その後

class Program { 
    [STAThread] 
    static void Main(String[] args) { 
     Console.WriteLine("Have {0} arguments", args.Length); 
     for (int i = 0; i < args.Length; ++i) { 
      Console.WriteLine("{0}: {1}", i, args[i]); 
     } 
    } 
} 

をして、引数を得るための唯一の方法は、「合併」は、具体的にそこにあるコマンドライン(上の引用符で囲むことですコマンドプロンプトから起動すると、時に別のチェックすることは難しいことができ渡されているかを確認することが容易になりますが

 
PS C:\...\bin\Debug> .\ConsoleApplication1.exe one two three 
Have 3 arguments 
0: one 
1: two 
2: three 
PS C:\...\bin\Debug> pushd ..\release 
PS C:\...\bin\Release> .\ConsoleApplication1.exe one two three 
Have 3 arguments 
0: one 
1: two 
2: three 
PS C:\...\bin\Release> pushd ..\..\obj\debug 
PS C:\...\obj\Debug> .\ConsoleApplication1.exe one two three 
Have 3 arguments 
0: one 
1: two 
2: three 
PS C:\...\obj\Debug> pushd ..\release 
PS C:\...\obj\Release> .\ConsoleApplication1.exe one two three 
Have 3 arguments 
0: one 
1: two 
2: three 
PS C:\...\obj\Release> .\ConsoleApplication1.exe -file test.txt 
Have 2 arguments 
0: -file 
1: test.txt 
PS C:\...\obj\Release> .\ConsoleApplication1.exe "-file test.txt" 
Have 1 arguments 
0: -file test.txt 

追加:あなたがスペースを含む引数を、下記の最後の例を参照)を持っていないようにしますアプリケーションがあなたのアプリケーションを起動します。しかし、Process Explorerのようなツールは、プログラムを起動するためのコマンドラインを表示します(プロセスをダブルクリックしてイメージタブを見てください)。

+0

私は悪いです:私はちょうど私のインストーラのファイル形式のオープンコマンドが "-file {0}"私は引用符を削除する必要がありました.... –

+0

おっと...簡単に行うことができないし、見つけにくい...直接実行されていない場合、実際に何が渡されているかを確認する方法にメモを追加します。 – Richard

0

Environment.GetCommandLineArgs()を試しましたか?

+0

ありがとうございます!しかし、最初の引数はプログラムの名前なので、コードに大きな変更が必要です。リリースビルドに関する既存の問題を回避する方法があるはずです。 –

+0

試してもまだ動作しません:-(カスタムキーファイルからの出力:First Key = [ファイルC:\ Temp \ test.dpk] Argsの数:1環境Argsの数:2 Argの数はちょうどargs.Length、Env。Argsの数はEnvironment.GetCommandLineArgs()です。長さ –

1

これはビン/デバッグ、ビン/リリース、OBJ /デバッグとOBJ /リリースから私の作品:あなたがいるとき

static class Program { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) { 
    FormMain.Args = args; 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new FormMain()); 
    } 
} 

    public partial class FormMain: Form { 
    public static string[] Args; 

    public FormMain() { 
     InitializeComponent(); 
    } 

    private void FormMain_Shown(object sender, EventArgs e) { 
     foreach (string s in Args) { 
     MessageBox.Show(s); 
     } 
    } 
    } 
+0

は、引数を取るためにctorのシグネチャを変更するのではなく、静的な文字列を持つのがよい理由はありますか? – abe

+0

いいえ、ありません。私は答えの簡潔さのために静的な文字列を使用しました。ご覧のとおり、私はArgsを公開フィールドとして宣言しました。実際のコードでは決してそれをしません。私たちの議論を保存するこのケースではそれほど重要ではない、私たちは別の種類の問題を解決しています。 –

0

あなたの問題は、(リチャードは彼のコード内で指摘するように)あなたの引数ということですリリース版の実行はすべて1つの引用符で囲まれています。引用符を削除すると動作します。

関連する問題