C# - Makrók használata a C#-ban

forráskód letöltése
Ebből a cikkből megismerhetjük a Visual Studio.NET makrózási lehetőségét, mellyel szinte tetszőleges funkciót végrehajthatunk, akár még a forráskódunkat is generálhatjuk, megváltoztathatjuk a makró futtatásával, vagyis programból generálhatjuk programunkat.
Makrók kezelésének első lépéseként nyissuk meg azt a segéd ablakot, mely a makrókhoz kötődik. Ezt a View – Other Windows – Makro Explorer menüpont kiválasztásával, vagy az Alt + F8 lenyomásával tehetjük meg.
A megjelenő ablakban két fő csoportot láthatunk. Az egyik a Samples. Ebben találunk néhány modult, melyben sok-sok makrót készen kapunk. Például az Utilities modulban a TurnOnLineNumbers makróra duplán kattintva elindíthatjuk azt és ezzel elérjük, hogy a forráskód szerkesztőben bekapcsoljuk a sorok számozását. Ezt kikapcsolni a TurnOffLineNumbers makróval lehet.
A másik fő csoport a MyMacros. Itt készíthetjük el saját makróinkat. Alapértelmezésben találunk itt egy Module1 modult, mely üres. Egy új makró létrehozásához kattintsunk itt jobb gombbal és válasszuk a New Macro menüpontot. Ennek hatására elindul a Visual Studio.NET makró szerkesztő modulja.
Itt nincs más dolgunk mint begépelni, létrehozni a kívánt funkciót. A példában létrehozunk egy MakeNumber nevű makrót, melyet a mellékelt Module1.vb állományban helyeztünk el.
Ez a makró sok értelmes funkcióval nem rendelkezik, de célja most nem is ez, hanem sokkal inkább az, hogy bemutassuk, hogy miként tudunk az aktuálisan megnyitott forráskódhoz hozzáférni, azt módosítani.
A megvalósított makrónak az a feladata, hogy az aktuális forráskódban a kijelölt szöveg minden egyes sorát besorszámozza. A kipróbáláshoz a makró létrehozása után jelöljünk ki néhány sort a forráskódban, mondjuk az összes using-al kezdődő sort, majd futtassuk a makrót. Az eredmény az alábbi lesz:
/* 1. */using System;
/* 2. */using System.Drawing;
/* 3. */using System.Collections;
/* 4. */using System.ComponentModel;
/* 5. */using System.Windows.Forms;
/* 6. */using System.Data;
Nézzük most a makrót, miként tudjuk benne megvalósítani ezt a funkciót:
Public Module Module1
    Sub MakeNumber()
        Dim i As Integer
        Dim sel As TextSelection
Elsőször is tudnunk kell, hogy az aktív forráskódban mi az a szövegterület mely ki lett jelölve. Ehhez az ActiveDocument Selection függvényét kell meghívnunk, mely egy TextSelection osztályt ad vissza, amely pont ezt fogja tárolni.
        sel = dte.ActiveDocument.Selection()
Következő lépésként szükségünk lesz néhány változóra, hogy az adott sor kezdetét meg tudjuk majd határozni, mivel a sorszámozást minden sor elejére szeretnénk beszúrni.
        Dim StartPoint As Editpoint
        StartPoint = sel.TopPoint.CreateEditPoint()
        Dim EndPoint As TextPoint
        EndPoint = sel.BottomPoint
Mielőtt tovább haladnánk, létrehozunk egy UndoContext osztályt, mellyel azt érjük el, hogy a forráskódon végrehajtott változtatásunk visszavonható lesz az Edit – Undo menüponttal.
        Dim undoObj As UndoContext = dte.UndoContext
A visszavonáshoz az Open függvényt kell meghívnunk egy sztringet átadva neki. Ez a sztring lesz az elvégzett műveletnek a neve és ez jelenik meg az Undo gomb listájában is.
        undoObj.Open("Make Number")
Most következik a lényegi funkció megvalósítása: egy ciklussal végigmegyünk az összes kijelölt soron egyesével és minden sor elejére beszúrunk egy megjegyzést, benne az adott sor sorszámával.
        i = 1
        Do While (StartPoint.LessThan(EndPoint))
            StartPoint.Insert("/* " + i.ToString() + ". */")
            i = i + 1
            StartPoint.LineDown()
            StartPoint.StartOfLine()
        Loop
Végső lépésként zárjuk az Undo műveletet a Close hívással, így a visszavonás az Open óta történt változtatásokat fogja érvényteleníteni.
        undoObj.Close()
    End Sub    
End Module