C# - Makró használata Visual Studio.NET-ben

forráskód letöltése
A Visual Studio.NET külön eszközt biztosít arra, hogy tetszőleges funkciókra makrókat írhassunk. A kész makrók ezt követően integráns részeit képezik a fejlesztőkörnyezetnek, akár annak objektumai – mint a szerkesztett projektek – is elérhetők funkcióikból. Cikkünkben a makrók létrehozásának és használatának lehetőségeit mutatjuk be egészen a kezdeti lépésektől.
A mellékelt projekt Comforts alkönyvtárában található makró-projektet (Comforts.vsmacros állomány) töltse be a keretrendszerbe, a Macro Explorer segítségével. Ehhez az ablak gyorsmenüben válassza a Load Macro Project menüpontot.
A Visual Studio.NET makrók olyan instrukciók és parancsok sorozatai, melyeket egy konkrét feladat automatikus végrehajtása érdekében csoportba gyűjtünk. A makrók segítségével automatizálhatók bizonyos ismétlődő feladatok.
A Visual Studio.NET önálló szoftverkomponensként tartalmaz egy makrók szerkesztésére alkalmas keretrendszert (IDE), mely lehetővé teszi, hogy a makró készítés, szerkesztés, és futtatás műveleteit egy eszközzel végezzük el.
Makró rögzítése
A makró készítés legegyszerűbb módja a makrók rögzítése (recording), mely művelet nagyon hasonlít a hangrögzítő berendezések működésére, vagyis a REC gomb megnyomása után a készülék minden hangot és neszt rögzít, ami a környezetben történik egészen a STOP gomb megnyomásáig. Ennek mintájára alkották meg a fejlesztők a makró-rögzítés elvét is, vagyis a keretrendszerben elvégzett valamennyi művelet rögzítésre kerül a rögzítés kezdetétől a rögzítés befejezéséig. Ennek eredménye a makró egy külön moduljába kerül, melyet újra futtathatunk, és amely elvégzi a korábban rögzített valamennyi feladatot.
A keretrendszer Tools menüjében válasszuk a Macros – Record TemporaryMacro pontot, majd kezdjünk el valamilyen szöveget begépelni a szöveges állományba.
A művelet végén válasszuk a kis eszköztárból a Stop műveletet a rögzítés befejezéséhez. Ekkor egy RecordingModule nevű új modul adódik a Macro Explorer ablakban aktívra állított makró projektjéhez, mely rendelkezik egy TempraryMacro metódussal. Ezt követően töröljük ki a szöveget a szöveges állományból, és kattintsunk a metódusra. A metódus egy pillanat alatt visszaírja a szöveget az állományba. A műveletet elvégző modul kódja a következő:

Public Module RecordingModule
  Sub TemporaryMacro()
    DTE.Windows.Item("TextFile1.txt").Activate()
    DTE.ActiveDocument.Selection.Text = "Ez egy minta állomány..."
  End Sub
End Module
A metódusban aktiváljuk a szöveges állományt, majd beillesztjük a szöveget.
Új makró projekteket a Macros IDE alpont megnyomásával elinduló környezetben hozhatunk létre, illetve itt szerkeszthetjük a meglévő makróinkat is.
Makró futtatása paraméter átadásával
Látható, hogy a fenti metódus nem rendelkezett paraméterrel. Most elkészítünk egy paramétert váró metódust, majd a makrónak egy paramétert átadva futtatjuk azt.
A metódus kódja a következő:
Sub ParamMethod(Optional ByVal text As String = "", Optional ByVal number As Integer = 0)
    MsgBox(text & number)
  End Sub
Látható, hogy két paramétert vár, egy karakterláncot, és egy egész számot. Ezeket a makró futtatásakor megjeleníti egy üzenetablakban.
A metódus futtatásához azonban el kell indítanunk a VS.NET IDE Command Window parancssor ablakát, melyben megadhatjuk a metódusnak a paramétereket is. A futtatást a következőképpen végezzük el:

Macros.Comforts.Module1.ParamMethod "Átadott szöveg",15
A Macro Explorer ablakban kattintva a metóduson, az paraméter nélkül fut le, így az üzenetablakban csak egy 0 jelenik meg, amely a szám típusú paraméter kezdeti értéke.
COM komponensek elérése makróból
A makrókban elérhetünk COM komponenseket is. Ehhez csupán referenciaként kell hozzáadni a COM típuskönyvtárát a makró projektjéhez.
A makró projektünk PlayAVI makrójában megvalósítjuk, hogy képes legyen AVI állományokat lejátszani. Az AVI állományok lejátszására a Windows rendszerkönyvtárában (/Windows/system32) található QUARTZ.DLL állomány képes, melynek típuskönyvtárát importálnunk kell egy új assembly-be a .NET Framework tlbimp.exe alkalmazása segítségével, a következő parancssorral:
tlbimp <winroot>:\Windows\system32\quartz.dll
Az eredmény egy QuartzTypeLib.dll állomány, melyet referenciaként meg kell adni a makró projektjében. A makró számára elérhető assembly-k egy külön mappában találhatóak, a makrók csak az ide elhelyezett assembly-ket láthatják, valamint a GAC elemeit. A mappa elérési útvonala a következő:
<winroot>:\\Program Files\Microsoft Visual Studio .NET\Common7\IDE\PublicAssemblies
Ide be kell tehát másoljuk a rendszerkönyvtárban létrejött állományt.
A makró projektjének gyorsmenüjéből az Add reference menüpontot kiválasztva elérhető, hogy a megjelenő ablakban a .NET fül alatt látható legyen az assembly.
Most már csak fel kell azt használni a PlayAVI metódusban. A kód a következő:

Sub PlayAVI()
    Dim graphManager As New QuartzTypeLib.FilgraphManager()
    Dim name As String = InputBox("Adja meg az AVI állomány nevét: ")
    graphManager.RenderFile(name)
    graphManager.Run()
  End Sub
A COM komponens FilgraphManager osztályát használjuk fel az AVI állomány elindítására. A RenderFile metódus paramétere a fájl neve lesz, melyet egy dialógusablakban kérünk be. A Run metódussal pedig elindítjuk azt.
Gyakori műveletek automatizálása
A mellékelt makró projektünkben elhelyeztünk három makrót, melyek gyakran használandó kódrészleteket szúrnak be az éppen szerkesztett dokumentumba. Ezek közül a CreateProperty makró egy property deklarációt illeszt a dokumentumba, amennyiben egy típust és egy nevet írunk az aktuális kurzorpozícióba, és kijelöljük azokat. A makró észleli a neveket, és ez alapján generál egy definíciót, melyet elrendezve illeszt be a kijelölt szöveg helyére.
Ehhez a dokumentum aktív kijelölését keresi meg, és az ott található szöveget dolgozza fel.
selection = DTE.ActiveDocument.Selection
A beillesztendő szöveget egy StringBuilder objektumban hozza létre, annak Append metódusával fűzve fel a karakterláncokat. Végül a kijelölt szöveg helyére illeszti a kész karakterláncot.
...
selection.Delete()
selection.Insert(sbuilder.ToString(), vsInsertFlags.vsInsertFlagsInsertAtStart)
A szöveg igazításához a kijelölt szöveget reprezentáló objektum SmartFormat metódusát használjuk fel.
selection.SmartFormat()
A projekt InsertForLoop makrójával egy FOR ciklust illeszthetünk be a projektünk éppen aktív állományába hasonló módszerrel.
Az InsertWhileLoop makrót pedig arra használhatjuk, hogy egy WHILE ciklus kódjának leírását takarítsuk meg.