Riktige måten å implementere C # konsoll applikasjon?

stemmer
20

Hva er den riktige måten å implementere og arkitekten en kommandolinje verktøyet som en C # konsoll applikasjon?

Bekymringer til adresse inkluderer riktig analyseringen av kommandolinje variabler, og den riktige måten å sende ut tekst. Mens Console.WriteLine () er den mest åpenbare valget for utgang, hva er de omstendigheter som man bør i stedet velger å skrive til standard feil bekken, .Error, .SetErrorStream, etc?

Hva er den riktige måten for at programmet skal avslutte stund tilbake en skikkelig returkode til å kalle kommandoen?

Hvordan skal den CancelKeyPress eventuelt kan iverksettes for å avbryte programmet? Er det bare for bruk når en asynkron operasjon skjer på en egen tråd?

Er det en kortfattet guide til kommandolinjeverktøyet programmering i C #, eller enda bedre åpen kildekode eller mal som jeg kunne bruke til å implementere riktig et relativt enkelt verktøy?

Publisert på 07/05/2009 klokken 19:14
kilden bruker
På andre språk...                            


5 svar

stemmer
2

Som for kommandolinjeargumentene, vil du finne ulike ordninger, men jeg har alltid vært en fan av

app.exe "self-explanatory arg" /noArgumentSwitch /argumentSwitch="argument"

Som for returkoden, kan du endre signaturen din Main()funksjon for å returnere en inti stedet void. Dette vil tillate deg å gå tilbake en kode for å kalle prosessen, hvis det er nødvendig.

Som for feilstrøm, har jeg aldri personlig brukt det, og jeg tror ikke at det skal gå på bekostning av å gi ut feil informasjon på standard output stream. Det er sannsynligvis bedre brukt for spesifikke feil debugging informasjon.

Svarte 07/05/2009 kl. 19:19
kilden bruker

stemmer
25

Feilmeldinger skal være skrevet til standardfeil aka Console.Error, og normal utgang til stdout aka Console.Out. Dette er spesielt viktig for "filter" type konsoll lapper hvis utgangs (standard ut) kan føres til en annen prosess, for eksempel i en batch-fil.

Vanligvis hvis det oppstår en feil, skrive en feilmelding til Console.Error og returnere en null resultat. Eller om det er et unntak, bare ikke bry behandler den.

For å returnere et resultat kode, kan du enten sende den som et argument for å Environment.Exit, sette Environment.ExitCode eiendom, eller returnere en annen verdi enn null fra hoved.

For enkle konsoll apps jeg ville:

  • har en hjelper klasse å analysere kommandolinjen.

  • har en fasade klasse som gir en testbar API for funksjonaliteten implementert av din kommandolinjeverktøyet. Som de fleste NET APIer, vil dette normalt kaste et unntak hvis det oppstår en feil.

  • hovedprogrammet bruker bare hjelperen å analysere kommandolinjen og kaller API bestått argumenter som sendes fra kommandolinjen. Den fanger eventuelt unntak kastet fra API, logger dem, skriver en brukerorientert feilmelding til Console.Error og angir en ikke-null-returkode.

Men jeg wouln't anser dette for å være en sann måte: det er egentlig ikke noe slikt som er grunnen til at du er usannsynlig å finne boken du leter etter.

Svarte 07/05/2009 kl. 19:35
kilden bruker

stemmer
5

Om hvordan man skal implementere kommando parsing, har jeg med hell brukt refleksjon og delegater før. De Måten det fungerer på er å dekorere kommandometoder med en spesiell egenskap du gjøre deg som sier at metoden bør være bruker startbar, enten gjennom metoden navn eller en streng som er angitt i attributtet, dvs:

[Command("quit")]
public void QuitApp()
{
    ...
}

På programmet oppstart kan du skanne en klasse for slike metoder, og butikk delegater som er rettet mot dem i en ordbok hvor tastene er kommandoene. Dette gjør det lett å analysere kommandoer som er basert på å lete opp den første ordet i en ordliste (amortisert O (1)), og er lett å utvide og maintanable for fremtiden, som nye kommandoer er tilsatt ganske enkelt å tilsette forskjellige metoder.

Svarte 07/05/2009 kl. 19:39
kilden bruker

stemmer
2

For kommandolinje håndtering, sjekk ut Mono.GetOptions. Det gjør det enkelt å fylle variabler fra kort (f stil) og lange (--file stil) kommandolinjevalg.

Svarte 07/05/2009 kl. 19:40
kilden bruker

stemmer
0

Jeg har valgt å skrive en rekke konsollen verktøyet apps som Windows Form applikasjoner i stedet for konsoll apps. Vanligvis jeg legge en forsinkelse første start og bare legge en avbryt-knapp med en fremgang meter - og dermed gir en mer intuitiv avbryte alternativ. Du kan fortsatt utgang til konsollen på den måten også.

Svarte 07/05/2009 kl. 19:54
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more