This article has been localized into Czech by the community.
Spouštění aplikací s třídou Process
Velmi užitečnou věcí, kterou můžete udělat ve své aplikaci, je spuštění jiné aplikace. Například možná budete chtít ve své aplikaci zahrnout odkaz na svůj web, a místo toho, abyste uživatele nutili ručně zadávat adresu do jejich prohlížeče nebo kopírovat/vkládat URL, by bylo pěkné udělat odkaz klikatelným a pak jednoduše otevřít výchozí prohlížeč uživatele.
V tomto tutoriálu používáme převážně konzolové aplikace, protože jsou méně složité a mohou lépe demonstrovat syntaxi jazyka bez zbytečných komplikací. Výše uvedený příklad je samozřejmě relevantnější pro aplikaci s grafickým uživatelským rozhraním (GUI), která používá jeden z .NET GUI frameworků, jako jsou WinForms nebo WPF, ale i tak může být užitečné spustit jinou aplikaci z vaší konzolové aplikace, a pokud ne, alespoň jste se naučili techniku pro pozdější použití.
Použití třídy Process
Pro spuštění jiné aplikace můžete použít třídu Process. Třída Process se nachází ve jmenném prostoru System.Diagnostics, takže budete muset tento jmenný prostor zahrnout:
using System.Diagnostics;
Ve své nejjednodušší formě můžete jednoduše použít statickou metodu Start() pro spuštění aplikace:
Process.Start("https://www.google.com/");
Všimněte si, že zde zadávám URL - stejně tak by to mohla být i cesta k lokální aplikaci, například Poznámkový blok (pokud pracujete na Microsoft Windows):
Process.Start(@"C:\Windows\notepad.exe");
Důvod, proč obě věci fungují, je ten, že třída Process jednoduše předává instrukci operačnímu systému s výzvou "spusť to!". Operační systém poté prověří poskytnuté informace a zjistí, zda má podporovanou akci nebo ne. Pokud je poskytnuta cesta k spustitelnému souboru, bude spuštěn - pokud je poskytnuto něco jiného, například URL nebo cesta k nějakému lokálnímu souboru, pokusí se to zpracovat s přidruženou aplikací. To také znamená, že svému programu můžete nařídit spuštění cesty k lokální složce - pokud používáte Windows, výsledkem bude spuštění Průzkumníka Windows, který vám ukáže požadovanou cestu.
Spouštění aplikací s argumenty/parametry
Často je užitečné poskytnout jednu nebo několik argumentů/parametrů při spouštění aplikace. Konzolové aplikace obvykle přijímají širokou škálu parametrů, ale i Windows aplikace obvykle mohou zpracovávat parametry poskytnuté přes příkazový řádek. Například, pokud spustíte Poznámkový blok, můžete mu dodat soubor, který chcete upravovat, takto:
Process.Start(@"C:\Windows\notepad.exe", @"C:\Windows\win.ini");
Funguje to, protože Poznámkový blok je navržen tak, aby hledal na příkazovém řádku parametr - použije první poskytnutý parametr jako cestu k souboru, který má být otevřen. Můžete snadno nahradit cestu k win.ini cestou k jednomu z vašich vlastních souborů a vyzkoušet si to!
Použití třídy ProcessStartInfo
Třída Process je docela složitá třída, která umí mnohem více než jen spustit aplikaci. Veškeré její možnosti si v tomto článku neprojdeme, protože se zaměřujeme hlavně na její schopnost spustit nový proces. Při spouštění někdy potřebujete trochu větší kontrolu nad tím, jak se to dělá, a to je místo, kde přichází na řadu třída ProcessStartInfo. Místo poskytnutí metody Start() s cestou můžete předat instanci třídy ProcessStartInfo, jako v tomto příkladu:
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = @"C:\Windows\notepad.exe";
processStartInfo.Arguments = @"C:\Windows\win.ini";
Process.Start(processStartInfo);
Tohle jednoduše udělá to, co jsme již dosáhli, takže se podívejme na některé zajímavé vlastnosti třídy ProcessStartInfo, kromě vlastností Filename a Arguments, které jsme právě použili v příkladu výše, což nám dá větší kontrolu:
Vlastnost WindowStyle
Použijte vlastnost WindowStyle k ovládání toho, jak se okno spuštěné aplikace zobrazuje. Například ji můžete spustit maximalizovanou nebo minimalizovanou, jako v tomto příkladu:
processStartInfo.WindowStyle = ProcessWindowStyle.Minimized;
Vlastnost CreateNoWindow
Vlastnost CreateNoWindow dosahuje přesně toho, co název napovídá: Když je nastavena na hodnotu true, pro spuštěnou aplikaci nebude vytvořeno okno. To je samozřejmě relevantní pouze pro aplikace schopné provádět úkony bez interakce s uživatelem, například pro konzolovou aplikaci přijímající vstup, zpracovávající ho a vracející výsledek volající aplikaci.
Vlastnost UseShellExecute
Tato vlastnost umožňuje ovládat, zda má být k spuštění procesu použit systémový shell, nebo má být proces vytvořen přímo z exe souboru. Tato vlastnost je ve výchozím nastavení true, pokud pracujete s .NET frameworkem před .NET Core, ale false ve výchozím nastavení, pokud používáte .NET Core. Tuto vlastnost použijeme v rozšířeném příkladu později.
Vlastnost WorkingDirectory
Tato vlastnost se používá k nastavení cesty adresáře, ze kterého chcete věci spustit. Mějte však na paměti, že se používá odlišně v závislosti na tom, zda je UseShellExecute nastaveno na true nebo false. Když je UseShellExecute nastaveno na true, vlastnost WorkingDirectory jednoduše určuje umístění spustitelného souboru a pracovní adresář aplikace, která spouští spustitelný soubor, je také pracovním adresářem spustitelného souboru. Když je UseShellExecute nastaveno na false, vlastnost WorkingDirectory se nepoužívá k nalezení spustitelného souboru - místo toho se její hodnota použije na spuštěný proces a má význam pouze v kontextu nového procesu.
Vlastnosti RedirectStandardInput, RedirectStandardOutput a RedirectStandardError
Tyto vlastnosti, když jsou nastaveny na true, mohou přesměrovat vstup/výstup a chyby z prováděného procesu do volajícího procesu. To je například užitečné v kombinaci s CreateNoWindow, protože to umožňuje spustit proces a poskytnout mu vstup a/nebo přijímat od něj chyby a výstup. Použiji to ve finálním příkladu níže, kde kombinujeme několik popsaných vlastností.
Kombinace toho všeho
Jsou tu ještě další vlastnosti, o kterých bychom mohli diskutovat, ale ty zvýrazněné jsou rozhodně nejzajímavější. Místo toho vám ukážu jeden poslední příklad, kde kombinujeme několik právě probíraných technik do něčeho opravdu skvělého. Nejprve vám dám celý příkladový kód a pak o něm budeme diskutovat:
Console.WriteLine("Press any key to run CMD...");
Console.ReadKey();
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = @"C:\Windows\system32\cmd.exe";
processStartInfo.Arguments = "/c date /t";
processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardOutput = true;
Process process = new Process();
process.StartInfo = processStartInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
Console.WriteLine("Current date (received from CMD):");
Console.Write(output);
Začínáme vytvořením objektu ProcessStartInfo. Používáme vlastnosti Filename a Arguments k určení, že chceme spustit příkaz Windows, používáním souboru cmd.exe (výchozí Windows Command Line Interpreter). Příkaz, který chceme spustit, je specifikován jako Arguments - v tomto případě používáme příkaz date s argumentem /t, což jednoduše vypíše aktuální datum.
Také si všimnete, že používám tři vlastnosti, o kterých jsme právě diskutovali: CreateNoWindow = true (chceme zachytit výstup bez zobrazení okna cmd), UseShellExecute = false (potřebujeme to tak, abychom mohli tento typ příkazu spustit) a RedirectStandardOutput = false (opět, chceme zachytit výstup).
Dále vytvoříme instanci Process, přiřadíme StartInfo a poté zavoláme metodu Start() pro spuštění procesu.
V dalších dvou řádcích požádáme o přijetí vygenerovaného výstupu voláním metody Process.StandardOutput.ReadToEnd(). Uložíme jej do řetězcové proměnné a poté zavoláme metodu WaitForExit(), abychom se ujistili, že proces, který jsme spustili, má možnost dokončit.
Ve dvou posledních řádcích jednoduše vypíšeme obdržený výstup - mělo by to vést k zobrazení aktuálního data. Samozřejmě, toto bylo MNOHO práce pro vypsání aktuálního data - mohli bychom to udělat jedním řádkem kódu. Ale toto demonstruje poměrně silnou techniku, umožňující vám volat jiné aplikace a používat jejich práci uvnitř vaší vlastní aplikace.
Shrnutí
Třída Process je velmi mocný nástroj, který vám umožňuje spouštět jiné procesy a dokonce je kontrolovat. V tomto článku jsme ukázali pouze některé z mnoha jejích schopností, ale doufáme, že vám to ukázalo, jak univerzální nástroj to je, abyste se mohli pokusit experimentovat s ním více.