C# - Egyszer futtatható alkalmazás készítése

forráskód letöltése
Demo alkalmazást többféle módszerrel készíthetünk. Vagy olyan módszert választunk, hogy a funkciók csak korlátozottan használhatók, vagy egy bizonyos idő után megakadályozzuk az alkalmazás elindítását. Az utóbbi esetet megvalósíthatjuk egy időkorláttal, vagy egy még egyszerűbb módon. Cikkünkben ezt a legegyszerűbb módszert mutatjuk be.
A megoldás lényege, hogy az első (és egyetlen) futás után töröljük a merevlemezről a programunk futtatható állományát. Ez azonban nem végezhető el a File osztály Delete metódusával, mert a művelet elvégzésekor a process még használja az adott állományt (természetesen).
A törlést úgy kell megoldani, hogy a törölt állomány ne jelenjen meg a Windows „szemétkosarában”, hanem visszaállíthatatlanul törlődjön a rendszerből. Ezt a műveletet a parancssori ERASE utasítással végezhetjük el. Ehhez azonban ideiglenes élettartammal létre kell hoznunk egy batch állományt, mely elvégzi a műveletet, végül magát is törli.
Az ERASE utasítás szintaxisa a következő:
ERASE <törlendő állomány elérési útvonala>
A mellékelt példában az alkalmazás bezárásakor fut le az a metódus, melyben megvalósítjuk a műveletet.
this.Disposed += new EventHandler(Delete);
Első lépésként az alkalmazás mappájában létrehozunk egy Delete.bat nevű parancsállományt.
FileStream fs = File.Create(Application.StartupPath + "\\Delete.bat");
A FileStream objektum tartalmának kiírásához szükségünk van egy StreamWriter objektumra.
StreamWriter sw = new StreamWriter(fs,System.Text.Encoding.Default);
Ezt követően egy címkén belül kiírjuk a szükséges utasításokat. Az első utasítás, hogy az ERASE parancssori utasítással töröljük az EXE állományt.
sw.WriteLine(":1");
sw.WriteLine("Erase \"" + Application.StartupPath + "\\Delete.exe\"");
Majd elhelyezünk egy olyan sort is, mely újra megvizsgálja az EXE állományt, és ha létezik, akkor az :1 címkére ugrik, és a művelet kezdődik elölről.
sw.WriteLine("If Exist \"" + Application.StartupPath + "\\Delete.exe" + "\" Goto 1");
Végül töröljük a parancsállományt is.
sw.WriteLine("Erase \"" + Application.StartupPath + "\\Delete.bat\"");
sw.Close();
fs.Close();
A létrehozás után a batch állományt le is futtatjuk a Process osztály Start metódusával.
Process.Start(Application.StartupPath + "\\Delete.bat");
A batch állomány a törlést képes elvégezni, hiszen a parancssort hívja segítségül, és a műveleteket a parancssori futtatórendszer végzi el.