ฉันจะส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยังแอปพลิเคชัน WinForms ได้อย่างไร


106

ฉันมีแอปพลิเคชัน WinForms สองแอปพลิเคชัน AppA & AppB ทั้งสองกำลังเรียกใช้. NET 2.0

ใน AppA ฉันต้องการเปิด AppB แต่ฉันต้องส่งอาร์กิวเมนต์บรรทัดคำสั่งไป ฉันจะใช้อาร์กิวเมนต์ที่ฉันส่งผ่านในบรรทัดคำสั่งได้อย่างไร

นี่เป็นวิธีหลักในปัจจุบันของฉันใน AppB แต่ฉันไม่คิดว่าคุณจะเปลี่ยนได้ไหม

  static void main()
  {
  }

คำตอบ:


118
static void Main(string[] args)
{
  // For the sake of this example, we're just printing the arguments to the console.
  for (int i = 0; i < args.Length; i++) {
    Console.WriteLine("args[{0}] == {1}", i, args[i]);
  }
}

จากนั้นอาร์กิวเมนต์จะถูกเก็บไว้ในargsอาร์เรย์สตริง:

$ AppB.exe firstArg secondArg thirdArg
args[0] == firstArg
args[1] == secondArg
args[2] == thirdArg

6
อินพุต: "what.exe -v foo / lol nisp" เอาต์พุต: args [0] = "-v"; args [1] = "foo"; args [2] = "/ lol"; args [3] = "nisp"; อะไรจะง่ายกว่านี้?
Callum Rogers

ไม่อยากจะเชื่อเลยว่าฉันเห็น 'string [] args' หลายครั้งหลังจากผ่านไปทั้งปีและมันไม่เคยเกิดขึ้นกับฉันเลยจนถึงตอนนี้! haha
Niklas

1
ดูเหมือนว่า args [0] คือพา ธ แบบเต็มและชื่อ exe ของแอ็พพลิเคชันที่รันอยู่และ args [1] เป็นพารามิเตอร์แรก
Allan F

198

วิธีที่ดีที่สุดในการทำงานกับ args สำหรับแอป winforms ของคุณคือการใช้

string[] args = Environment.GetCommandLineArgs();

คุณสามารถจับคู่สิ่งนี้กับการใช้enumเพื่อทำให้การใช้อาร์เรย์เป็นไปอย่างมั่นคงผ่านฐานรหัส

"และคุณสามารถใช้สิ่งนี้ได้ทุกที่ในแอปพลิเคชันของคุณคุณไม่เพียงถูก จำกัด ให้ใช้ในเมธอด main () เหมือนในแอปพลิเคชันคอนโซล"

พบที่: HERE


25
องค์ประกอบแรกในอาร์เรย์ประกอบด้วยชื่อไฟล์ของโปรแกรมเรียกใช้งาน หากไม่มีชื่อไฟล์องค์ประกอบแรกจะเท่ากับ String.Empty องค์ประกอบที่เหลือมีโทเค็นเพิ่มเติมที่ป้อนในบรรทัดคำสั่ง
EKanadily

@docesam ที่ช่วยฉันได้มากขอบคุณ! สงสัยว่าทำไมมันถึงพยายามโหลดโปรแกรมตัวเองเป็นข้อความ
Kaitlyn


หลังจากหลายปีของการพัฒนา C # ฉันไม่เคยรู้เลยว่ามีวิธีนี้ ดี.
CathalMF

1
การใช้วิธีนี้กับการส่งพารามิเตอร์มีประโยชน์main(string[] args)หรือไม่?
Adjit

12

คุณสามารถคว้าบรรทัดคำสั่งของแอ็พพลิเคชัน. Net ใด ๆ โดยการเข้าถึงคุณสมบัติ Environment.CommandLine มันจะมีบรรทัดคำสั่งเป็นสตริงเดียว แต่การแยกวิเคราะห์ข้อมูลที่คุณต้องการไม่น่าจะยากมาก

การมีเมธอด Main ว่างเปล่าจะไม่ส่งผลต่อคุณสมบัตินี้หรือความสามารถของโปรแกรมอื่นในการเพิ่มพารามิเตอร์บรรทัดคำสั่ง


26
หรือใช้ Environment.GetCommandLineArgs () ซึ่งส่งคืนอาร์เรย์สตริงของอาร์กิวเมนต์เช่นเดียวกับ Main (string [] args)
Brettski

11

พิจารณาว่าคุณจำเป็นต้องพัฒนาโปรแกรมซึ่งคุณต้องส่งผ่านข้อโต้แย้งสองข้อ ก่อนอื่นคุณต้องเปิดคลาสProgram.csและเพิ่มอาร์กิวเมนต์ในเมธอดหลักดังต่อไปนี้และส่งอาร์กิวเมนต์เหล่านี้ไปยังตัวสร้างของฟอร์ม Windows

static class Program
{    
   [STAThread]
   static void Main(string[] args)
   {            
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       Application.Run(new Form1(args[0], Convert.ToInt32(args[1])));           
   }
}

ในคลาสฟอร์ม windows ให้เพิ่มตัวสร้างพารามิเตอร์ซึ่งรับค่าอินพุตจากคลาสProgramดังต่อไปนี้

public Form1(string s, int i)
{
    if (s != null && i > 0)
       MessageBox.Show(s + " " + i);
}

ในการทดสอบสิ่งนี้คุณสามารถเปิดพรอมต์คำสั่งและไปที่ตำแหน่งที่วาง exe นี้ไว้ ตั้งชื่อไฟล์ตามด้วยพารามิเตอร์ parmeter1 2 ตัวอย่างเช่นดูด้านล่าง

C:\MyApplication>Yourexename p10 5

จากรหัส C # ข้างต้นก็จะแจ้งให้ MessageBox p10 5ที่มีค่า


7

คุณใช้ลายเซ็นนี้: (ใน c #) โมฆะแบบคงที่ Main (string [] args)

บทความนี้อาจช่วยอธิบายบทบาทของฟังก์ชันหลักในการเขียนโปรแกรมได้เช่นกัน: http://en.wikipedia.org/wiki/Main_function_(การเขียนโปรแกรม )

นี่คือตัวอย่างเล็กน้อยสำหรับคุณ:

class Program
{
    static void Main(string[] args)
    {
        bool doSomething = false;

        if (args.Length > 0 && args[0].Equals("doSomething"))
            doSomething = true;

        if (doSomething) Console.WriteLine("Commandline parameter called");
    }
}

4

นี่อาจไม่ใช่โซลูชันยอดนิยมสำหรับทุกคน แต่ฉันชอบ Application Framework ใน Visual Basic แม้ว่าจะใช้ C # ก็ตาม

เพิ่มการอ้างอิงถึง Microsoft.VisualBasic

สร้างคลาสชื่อ WindowsFormsApplication

public class WindowsFormsApplication : WindowsFormsApplicationBase
{

    /// <summary>
    /// Runs the specified mainForm in this application context.
    /// </summary>
    /// <param name="mainForm">Form that is run.</param>
    public virtual void Run(Form mainForm)
    {
        // set up the main form.
        this.MainForm = mainForm;

        // Example code
        ((Form1)mainForm).FileName = this.CommandLineArgs[0];

        // then, run the the main form.
        this.Run(this.CommandLineArgs);
    }

    /// <summary>
    /// Runs this.MainForm in this application context. Converts the command
    /// line arguments correctly for the base this.Run method.
    /// </summary>
    /// <param name="commandLineArgs">Command line collection.</param>
    private void Run(ReadOnlyCollection<string> commandLineArgs)
    {
        // convert the Collection<string> to string[], so that it can be used
        // in the Run method.
        ArrayList list = new ArrayList(commandLineArgs);
        string[] commandLine = (string[])list.ToArray(typeof(string));
        this.Run(commandLine);
    }

}

ปรับเปลี่ยนรูทีน Main () ของคุณให้มีลักษณะเช่นนี้

static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        var application = new WindowsFormsApplication();
        application.Run(new Form1());
    }
}

วิธีนี้นำเสนอคุณสมบัติที่เป็นประโยชน์เพิ่มเติมบางอย่าง (เช่นการสนับสนุน SplashScreen และเหตุการณ์ที่เป็นประโยชน์บางอย่าง)

public event NetworkAvailableEventHandler NetworkAvailabilityChanged;d.
public event ShutdownEventHandler Shutdown;
public event StartupEventHandler Startup;
public event StartupNextInstanceEventHandler StartupNextInstance;
public event UnhandledExceptionEventHandler UnhandledException;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.