A mellékelt példában egy TextBox kontrol soraiban megadott, C# nyelven megírt forráskódot adunk át a fordító osztálynak a megfelelő paraméterek kíséretében. A művelet a ’Fordítás’ feliratú gombra kattintva érhető el, a paraméterek megadásával pedig közöljük a fordítóval, hogy milyen néven, és módon generáljon futtatható állományt, melyet a ’Futtatás’ gombbal indíthatunk el.
Példánkban egy C# nyelven megírt, tipikus ’Helló Word’ feliratot a standard kimenetre író Konzol-alkalmazást fordítunk le a megadott néven.
A műveletet végrehajtó gomb kezelőfüggvényében először létrehozunk egy példányt a Microsoft.CSharp névtér CSharpCodeProvider osztályából, hogy hozzáférjünk a fordító-, illetve kódgeneráló-objektumhoz.
private void buildButton_Click(object sender, System.EventArgs e)
{
...
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
Az osztály CreateCompiler metódusával létrehozhatunk egy ICompiler interfészt, melynek metódusait és property-jeit használhatjuk fel a fordításhoz. Ez implementálja a fordító-motort:
ICodeCompiler compiler = codeProvider.CreateCompiler();
A System.CodeDom.Compiler névtér CompilerParameters nevű osztályát példányosítva létrehozunk egy objektumot, mely property-jeiben tartalmazza a fordítási paramétereket.
CompilerParameters parameters = new CompilerParameters();
Az osztály property-jeinek jelentős részét fel kell töltenünk, hogy a fordítás működjön. A GenerateExecutable property-vel megadjuk, hogy futtatható állományt generáljon a fordító:
parameters.GenerateExecutable = true;
A Form megfelelő szerkesztőmezőjében megadott névvel feltöltjük az OutputAssembly nevű property-t, mellyel megadjuk, hogy mi legyen a futtatható állomány neve:
parameters.OutputAssembly = nameText.Text;
A másik szerkesztőmezőben meg kell adnunk, hogy mi a neve a forráskód Main függvényét tartalmazó osztálynak, a névtér nevével együtt, attól ponttal elválasztva. Ez a fordítási paraméterek-objektum MainClass property-jének ad értéket:
parameters.MainClass = classText.Text;
A felületen található CheckBox kontrolt bejelölve rendelkezhetünk arról, hogy a futtatható állomány tartalmazzon-e DEBUG információkat. A paraméter-objektum IncludeDebugInformation property-jét állítjuk ezzel:
parameters.IncludeDebugInformation = includeDebug.Checked;
A CompilerParameters osztály ReferencedAssemblies property-je egy karakterlánc-tömb, melyben a fordításkor hivatkozott assembly-ket kell összegyűjtenünk. Ez a módszer csak egyszerű kódok esetén elégséges. Ehhez az AppDomain osztály GetAssemblies metódusát használjuk fel, és minden egyes Assembly osztályú objektumot felveszünk a paraméter-objektum assembly-listájába:
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
parameters.ReferencedAssemblies.Add(asm.Location);
}
Végül a szövegmező Text property-jébe írt szöveget, mint forráskódot, valamint a feltöltött paraméterlistát tartalmazó objektumot átadjuk a fordítót reprezentáló objektum CompileAssemblyFromSource metódusának, mely elvégzi a műveletet. Hiba esetén annak előfordulását üzenetablakban jelezzük. A sorozat következő részében foglalkozunk részletesen a fordítási hibák analizálásával.
CompilerResults results = compiler.CompileAssemblyFromSource(parameters, codeStr);
...
}
Amennyiben a forráskód nem tartalmazott rendellenességet, a fordítás hiba nélkül lezajlik, generálva egy megadott nevű futtatható állományt, mely a konzol-alkalmazásunkat tartalmazza.
Az elkészült alkalmazást a megfelelő gombra kattintva futtathatjuk. A futtatást a System.Reflection névtér Process osztályának Start metódusával végezzük, mely egy ProcessInfo objektumot vár paraméterként. Ezt a létrehozott alkalmazás futtatható állományának nevével hozzuk létre, és ez tartalmazza a szükséges információkat:
...
ProcessStartInfo pInfo = new ProcessStartInfo(nameText.Text);
Process.Start(pInfo);
...