23 Stimmen

Wie man auf Befehlszeilenparameter außerhalb von Main in C# zugreift

Ich schreibe eine .NET-Klasse, die den Befehlszeilenparameter des Prozesses analysieren muss. Ich möchte keine Abhängigkeit zwischen der Main()-Methode und dieser Klasse haben. Wie kann die Klasse auf die Befehlszeile zugreifen?

46voto

itowlson Punkte 72130

Rufen Sie Environment.GetCommandLineArgs() auf.

2 Stimmen

GetCommandLineArgs ist ernsthaft fehlerhaft. Vermeiden Sie es. Verbreitet das Wort.

5voto

Stéphane B. Punkte 3140

Wenn Sie .NET Compact Framework verwenden, wird die Environment.GetCommandLineArgs()-Methode nicht implementiert und System.Diagnostics.Process.GetCurrentProcess().StartInfo.Arguments gibt immer einen leeren String zurück, sodass Sie die main-Funktion verwenden müssen und Argumente an Ihre anderen Klassen übergeben müssen.

Ein Beispiel :

[MTAThread]
static void Main(String[] commandLineArguments)
{
  CommandLineHelper.parse(commandLineArguments);
}

public static class CommandLineHelper
{
  public static void parse(String[] commandLineArguments) {
    // fügen Sie hier Ihren Code hinzu
  }
}

0 Stimmen

Vielen Dank für den Hinweis zum Compact Framework. In meinem Fall wollte ich das Hauptformular nicht anzeigen, wenn Argumente angegeben wurden, damit die exe im Silent-Modus ausgeführt wird. Wie Sie vorgeschlagen haben, könnten Sie diese Argumente in der statischen Klasse speichern, die allen Formularen der Anwendung zur Verfügung stehen würde. Dies sollte in jedem Framework funktionieren. Für Interessierte hier war mein Code. [MTAThread] static void Main(String[] cmd) { if (cmd.Length == 0) Application.Run(new frmMain()); else MessageBox.Show(cmd[0]); }

2voto

Myname Punkte 21

String[] myStr = Environment.GetCommandLineArgs();

es ist immer gut, das Beispiel zu vervollständigen.

1voto

Scott Langham Punkte 55597
System.Diagnostics.Process.GetCurrentProcess().StartInfo.Arguments

0 Stimmen

Eigentlich scheint das nicht zu funktionieren. Es scheint immer leer zu sein. Siehe stackoverflow.com/questions/344056/…

1voto

Neil Barnwell Punkte 39692

Erstellen Sie eine Klasse, die die Optionen Ihrer Anwendung enthält. Erstellen Sie in der Hauptmethode eine Instanz dieser Klasse, initialisieren Sie sie mit den Befehlszeilenargumenten und übergeben Sie sie an die Klassen, die sie benötigen.

Alternativ könnte die Klasse zu einem beliebigen Zeitpunkt danach initialisiert werden, indem sie über eine CustomConfigClass.Create()-Methode erstellt wird, die Environment.GetCommandLineArgs() verwendet.

Die erste Option wäre meine Empfehlung, da sie die Klasse einfacher für Unit-Tests vorbereitet und einen Wechsel zu einer alternativen Konfigurationsmethode zu einem späteren Zeitpunkt ermöglicht, ohne die Anwendung aufgrund einer Abhängigkeit von der Befehlszeile zu unterbrechen.

0 Stimmen

Die erste Option erfordert immer noch, dass die Hauptmethode über die andere Klasse Bescheid weiß, daher löst sie mein Problem nicht. Ich verwende einen IOC-Container, daher werde ich einen Dienst erstellen, der die Funktionalität GetCommandLineArgs bereitstellt, und meinen anderen Dienst davon abhängig machen. Danke.

1 Stimmen

Das verfehlt jedoch leicht meinen Punkt. Wenn Sie IoC verwenden, sollten Sie keinen Service haben, der die Befehlszeilenargumente zurückgibt, sondern eine Service-Schnittstelle, die die Konfiguration zurückgibt, und diese mit einer Klasse implementieren, die diese von der Befehlszeile abruft. Auf diese Weise können Sie sie durch eine andere Klasse für Unit-Tests ersetzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X