C# - Fájlműveleteket végző beépülő modul

forráskód letöltése
A Software Online hasábjain foglalkoztunk már a Visual Studio.NET keretrendszerbe beépülő modulok (Add-in) fejlesztésének lehetőségével. Most egy új lehetőséggel ismerkedhetünk meg a témában. Egy modult készítünk, melyet alkalmassá teszünk arra, hogy képes legyen új állományt hozzáadni egy megnyitott projekthez, illetve megnyitni szerkesztésre. Ehhez a művelethez azokat a minta-állományokat (template) használjuk fel, melyeket az IDE is használ egy-egy új elem hozzáadásakor.
A mellékelt példa használatához fordítsa le a projekteket, futtassa le a ReCreateCommands.reg állományt, majd indítsa újra a Visual Studio.NET keretrendszert.
Az elkészítendő modul a Visual studio.NET IDE Tools menüjében jelenik meg legfelső menüpontként. A menüpont kiválasztásakor megjelenítünk egy dialógus ablakot (FormFileAddin projekt), melyben megadhatjuk, hogy csak egy Text állományt szeretnénk megnyitni szerkesztésre (ekkor jelölt a CheckBox kontrol), vagy egy új Form, UserControl, vagy CSharp kódfájl állományát szeretnénk a projekt részévé tenni.
A beépülő modul létrehozását egy önálló projektfajta segíti, mely az Other Projects csoportban található, az Extensibility Projects alcsoportban. Létrehozásához válasszuk a Visual Studio.NET Add-in típust. Egy varázsló segítségével haladhatunk végig a létrehozás folyamatán.
A hatlépéses varázsló negyedik paneljén meg kell adnunk, hogy a modul rendelkezzen felhasználói felülettel, valamint, hogy az IDE indulásakor töltődjön be. A varázsló többi ablaka opcionális kérdéseket tesz fel a modullal kapcsolatban. Ezeket átugorhatjuk. A létrehozott projekthez kapcsolódik egy telepítő alkalmazás projektje is, melyre most példánkban nem lesz szükség.
A projekt Connect.cs állománya tartalmazza a szükséges osztály deklarációját, melynek jelentős, és felhasznált metódusait most elemezzük.
A projekt fordításakor a modul assembly-je COM komponensként regisztrálódik.
Az osztály OnConnection metódusában történik meg a menüpont létrehozása, majd elhelyezése a menürendszerben. A legtöbb művelet kódját készen kapjuk, csupán apró kiegészítéseket kell itt eszközölnünk, a modul megjelenésének testre szabása érdekében.
A létrehozás a Commands osztály statikus AddNamedCommand metódusával történik, melynek második paramétere a parancs neve, harmadik paraméterben kell megadnunk a menüponton megjelenő szöveget.

Command command = commands.AddNamedCommand(addInInstance, "InsFileAddin", "Állomány beszúrása", "Executes the command for InsFileAddin", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled);
Majd a parancs bekerül a parancslistába, a következő módon:
CommandBarControl commandBarControl = command.AddControl(commandBar, 1);
A Tools menüben megjelenő menüpontra kattintva felbukkan a dialógusablak, amelynek típusa Form1. Az osztály két változója lényeges, melyek tartalmazzák a Form-on megadott adatokat. A name változóban adjuk meg az állomány nevét, projektállomány megadásakor template változó tartalmazza a létrehozandó elem elérési útvonalát.
A felhasználandó mintaállományok a VS.NET mappájában találhatóak, a következő elérési útvonalon:
<winroot>:\\Program Files\Microsoft Visual Studio .NET\Vc#\CSharpProjectItems\
A példában a felbukkanó ablak listájából választhatjuk ki, hogy egy kódfájlt, egy Form-os, vagy egy felhasználói kontrolt adunk a projekthez. A felhasználandó állományok: NewCSharpFile.cs, CSharpAddWinFormWiz.vsz, és CSharpAddUserControlWiz.vsz. Amikor kiválasztás és a névmegadás megtörténik, az OK gombbal indítható a létrehozás. Ekkor a Form bezáródik, de nem semmisül meg.
A modul Exec metódusában meghívjuk az InsertFile metódust, melyben elvégezzük a létrehozást. A kulcsszerep az applicationObject nevű objektumé, ezt használjuk. Első lépésben ellenőrizzük, hogy van-e megnyitott solution. Ha nincs, hibaüzenetet adunk.
if (!applicationObject.ItemOperations.DTE.Solution.IsOpen)
{
  MessageBox.Show("Nincs megnyitva projekt!");
  return;
}
Ellenkező esetben példányosítjuk a Form1 osztályt, majd megjelenítjük a dialógusablakot.
f = new Form1();
f.ShowDialog();
Ha a név mezőt kitöltöttük, és a template változó nem tartalmaz értéket (vagyis csak egy szimpla szöveges állományt akarunk megnyitni), akkor a következőt tesszük:

if (f.name != "")
{
  if (f.template == "")
  {
    applicationObject.ItemOperations.NewFile("General\\Text File", f.name,Constants.vsViewKindCode);
  }
A NewFile metódussal nyitunk meg egy új szöveges állományt, mely csak megnyílik, de nem lesz a projekt része.
A hozzáadáskor lekérdezzük egy objektumba a solution első projektjét.
  ...
  EnvDTE.Project actproject = applicationObject.ItemOperations.DTE.Solution.Projects.Item(index);
Majd az AddFormTemplate metódussal (első paramétere a template elérési útvonala, második paramétere a fájl neve) létrehozunk egy új projektelemet, és a projekthez adjuk.
actproject.ProjectItems.AddFromTemplate(f.template,f.name);