V tomto článku bych vám chtěl ukázat možnosti ladění a kompilace .NET aplikací prostřednictvím příkazového řádku. Řekl bych, že to patří k základním dovednostem .NET vývojařů a na tomto serveru to doposud chybělo.
Naprostá většina z vás využívá při práci s jazykem C# vývojové prostředí, které se stará o kompilaci projektu a obsahuje grafický debugger – Visual Studio 2005, #Develop nebo třeba Turbo C#. Je to pochopitelné, ale přesto může nastat situace, kdy dané IDE není k dispozici a je nutné kompilovat a ladit aplikace prostřednictvím příkazového řádku. V tomto článku vám přiblížím základní možnosti nástrojů csc.exe a cordbg.exe, protože si myslím, že ovládání těchto nástrojů by mělo patřit k základním dovednostem .NET programátorů. Zmíněné nástroje jsou součásti balíku .NET Framework 2.0 SDK.
Konfigurace PC
Než začnete s kompilátorem a debuggerem pracovat, musíte systému říct, kde je má hledat. Nejrychlejší je spuštění příkazového řádku přes zástupce SDK Command Prompt, který by se měl nacházet v nabídce Start → Všechny programy → Microsoft .NET Framework SDK v2.0. Pokud tomu tak není, můžete ho jednoduše vytvořit. Jako cíl nového zástupce uveďte (včetně všech uvozovek):
C:\WINDOWS\SYSTEM32\cmd.exe /k ""C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sdkvars.bat""
Do části „Spustit v“ zadejte:
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\"
Pokud chcete k nástrojům jednoduše přistupovat z běžného příkazového řádku, bude nutné pozměnit obsah systémové proměnné Path. To provedete podle následujícího postupu:
- Klikněte pravým tlačítkem na ikonu Tento počítač a zvolte Vlastnosti.
- Na záložce Upřesnit stiskněte tlačítko Proměnné prostředí.
- V seznamu Systémové proměnné poklikejte na proměnnou Path.
- Každá hodnota je od předcházející oddělená středníkem. Pro konfiguraci kompilátoru csc.exe přidejte cestu k adresáři .NET Frameworku:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
- Pro využívání debuggeru cordbg.exe a dalších nástrojů přidejte ještě cestu k adresáři .NET SDK:
C:\Program Files\Microsoft Visual Studio 8\SDK\V2.0\Bin\
Práce s kompilátorem
Teď už jste připraveni k pohodlné kompilaci souborů .cs. V textovém editoru vytvořte nový soubor a zapište do něj zdrojový kód:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test");
}
}
}
Uložte soubor na nějaké vhodné místo (např. C:\Test) pod názvem Test.cs. Teď vás seznámím se základními výstupními volbami kompilátoru csc.exe. Volby se zapisují v podobě přepínačů před názvem vstupního souboru. V závorce jsou uvedené zkrácené tvary. Další možnosti kompilátoru zobrazíte příkazem csc /?.
Volba | Význam |
/out | Uvádí název právě vytvářené assembly. |
/target:exe [/t:exe] | Vytvoří spustitelnou konzolovou aplikaci. |
/target:library [/t:library] | Vytvoří jednosouborovou assembly .dll. |
/target:module [/t:module] | Vytvoří modul – prvek vícesouborové assembly. |
/target:winexe [/t:winexe] | Podobný přepínač jako /t:exe – nezobrazí okno konzole. |
Nyní spusťte příkazový řádek, přejděte do složky, kam jste umístili zdrojový soubor, a zadejte příkaz:
csc /out:Test.exe /target:exe Test.cs
Přepínač /target:exe můžete nahradit zkratkovým tvarem /t:exe a nebo ho můžete úplně vynechat, protože se jedná o výchozí volbu. Pokud nemáte zvláštní požadavky, můžete vynechat i přepínač /out. V takovém případě dojde k automatické volbě názvu assembly. V případě .dll bude název stejný jako název počátečního vstupního souboru, v případě .exe by měl být zvolen název typu, který obsahuje metodu Main(). Následně můžete aplikaci spustit.
Budete-li chtít kompilovat aplikaci z několika vstupních souborů, stačí uvést jejich výčet nebo můžete použít zástupný znak *, kterým informujete kompilátor, že má použít všechny vstupní soubory z daného adresáře.
csc /out:Test.exe /target:exe *.cs
Odkazy na externí assembly
V předchozí části jste využívali typ System.Console, který je uveden v assembly mscorlib.dll – kompilátor na ní odkazuje automaticky, ale můžete to zrušit uvedením přepínače /nostdlib. Nyní trochu pozměňte obsah zdrojového souboru.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test");
MessageBox.Show("Test System.Windows.Forms");
}
}
}
Odkazy na externí assembly přidáváte prostřednictvím klíčového slova using. Následně musíte kompilátor informovat, která assembly obsahuje použité jmenné prostory – to uděláte prostřednictvím přepínače /reference (zkráceně /r). V tomto případě je „nutné“ uvést assembly System.Windows.Forms.dll, protože používáte typ System.Windows.Forms.MessageBox a assembly System.Drawing pro demonstraci odkázání na více externích assembly (oddělují se středníkem).
csc /r:System.Windows.Forms.dll;System.Drawing.dll /out:Test.exe /target:exe *.cs
Příkazové soubory
Při budování složitějších aplikací by bylo při nejmenším zdlouhavé zadávat každý příkaz zvlášť. Proto je možné využívat tzv. příkazové soubory. Příkazové soubory mají příponu .rsp a obsahují všechny příkazy, které se mají při kompilaci vykonat. Vytvořte nový soubor a uložte ho do stejného adresáře jako Test.rsp.
# odkazy na assembly
/r:System.Windows.Forms.dll;System.Drawing.dll
# název a typ výstupní assembly
/out:Test.exe /target:exe
# vstupní soubory
*.cs
Příkazový soubor předáte kompilátoru prostřednictvím znaku @, můžete samozřejmě uvést více příkazových souborů.
csc /out:NewTest.exe @Test.rsp
Uvedený přepínač /out nebude platný, protože bude překryt příkazem v souboru Test.rsp a název výstupní assembly tedy bude Test.exe. Výjimka platí pro přepínač /r, který je kumulativní.
Kompilátor implicitně využívá příkazový soubor csc.rsp, který je umístěn ve stejném adresáři jako samotný kompilátor. Jeho využívání můžete potlačit přepínačem /noconfig.
Práce s debuggerem
Debuggeru pro příkazový řádek se budu věnovat méně podrobně, protože ho jen málokdo bude používat. Níže naleznete seznam základních příkazů, které je možné použít. Podobně jako u kompilátoru je možné zobrazit další možnosti příkazem cordbg /?.
Příkaz | Význam |
break [b] | Nastaví nebo zobrazí zarážky. |
delete [del] | Odstraní jednu nebo více zarážek. |
exit [ex] | Ukončí práci debuggeru. |
go [g] | Pokračuje v ladění, dokud nenarazí na další zarážku. |
out [o] | Krokuje ven z aktuální funkce. |
print [p] | Vytiskne všechny načtené proměnné. |
si | Krokuje k dalšímu řádku. |
so | Krokuje přes další řádek. |
Než začnete svou aplikaci ladit, je dobré vygenerovat pro ni ladící symboly – když to neuděláte, nebudete moci při ladění prohlížet svůj zdrojový kód, ale pouze kód CIL, o kterém toho pravděpodobně moc nevíte. Soubor s ladícími symboly vytvoříte uvedením přepínače /debug při kompilaci.
csc /debug @Test.rsp
Pokud máte vygenerovaný soubor s ladícími symboly (přípona .pdb), stačí už jen otevřít relaci s cordbg.exe.
cordbg Test.exe
Více se debuggeru věnovat nebudu – v případě potřeby si vyhledejte informace v dokumentaci .NET Framework SDK.
Závěr
Zmíněné postupy je možné ve velké míře aplikovat i na kompilátory ostatních .NET jazyků, ale nikdy je nepoužívejte při tvorbě rozsáhlejších projektů – bude to pro vás znamenat pouze velkou ztrátu času. Veškeré zmíněné cesty k adresářům upravte vzhledem ke konfiguraci vašeho systému a k verzi nainstalovaného .NET Frameworku.