ورود

View Full Version : آموزش: single instance در C# به کمک VB



mehrvarz9
جمعه 22 مرداد 1389, 08:58 صبح
با سلام به همه مشتاقان یادگیری
نمی دونم تابحال کسی درباره Single instance application چیزی نوشته یا نه در هر صورت من چیزی رو که خوندم به شما هم می گم شاید مورد استفادتون قرار بگیره.
اگر می خواهید برنامه شما فقط یک بار اجرا بشه و در زمان اجرای مجدد در صورتی که برنامه از قبل باز هست یک پیغام نمایش داده بشه یا هر کار دیگه ای صورت بگیره چند روش وجود داره که یکیشون استفاده از کلاس پایه WindowsFormsApplicationBase در فضای نام Microsoft.VisualBasic.ApplicationServices هست خوب من هم برای اولین بار که این مطلب رو دیدم تعجب کردم که سی شارپ خودش چاره ای برای این کار نداره.
اگر در برنامه های wpf دقت کرده باشید یک کلاس به نام App وجود داره که از کلاس پایه Application مشتق شده .کلاس Application کلاسی هست که برنامه با ساخته شدن یک نمونه از آن اجرا میشه و رویداد هایی همچون startup را کنترل می کنه و در نهایت برنامه با آزاد شدن شیء application به انتها می رسه.برای اجرا کردن برنامه کلاس application به تنهایی کافیه اما ویژوال استدیو کلاس App رو برای اینکه بتوان رویداد هایی application رو بصورت مرتب تر نوشت ایجاد می کنه.
این کلاس App دو قسمت هست یک قسمتش که در فایل app.xaml.cs وجود داره و شما می تونید اون رو در پنجره سلوشن ببینید و قسمت دیگرش هم که مخفی هست و برای دیدن اون باید به پوشه projectSHOMA\obj\debug برید و فایلی بانام app.g.cs رو باز کنید.اگر دقت کتید متد main() رو می بینید که یک شیء از کلاس App با نام app ساخته و در ادامه متد run() اون رو صدا زده.
مشکل کلاس Application سی شارپ اینه که مشخصه ای برای single instance کردن برنامه نداره برای همین از ویژوال بیسیک که این توانایی رو داره کمک می گیریم.
خوب بریم سر اصل مطلب یک پروژه wpf بسازید و Microsoft.VisualBasic را به References اضافه کنید سپس فایل app.xaml.cs رو باز کنید ویک کلاس زیر رو بسازید:


public class WpfAppWrapper : Microsoft.VisualBasic.ApplicationServices.WindowsF ormsApplicationBase

{

}
کلاس WindowsFormsApplicationBase مشخصه IsSingleInstance رو داره که مشخص می کنه آیا برنامه ما single instance هست یا نه. برای استفاده از این مشخصه کانستراکتور زیر رو برای True کردن مشخصه، به کلاس اضافه می کنیم.


public WpfAppWrapper()

{

this.IsSingleInstance = true;

}
حالا یک شیء از کلاس App که قبلا به وسیله متد main() ساخته شده بود رو به وسیله رویداد onstartup کلاس WindowsFormsApplicationBase می سازیم برای این کار کد زیر رو به کلاستون اضافه کنید.


private App app;

protected override bool OnStartup(Microsoft.VisualBasic.ApplicationService s.StartupEventArgs eventArgs)

{

app = new App();

app.InitializeComponent();

app.Run();

return false;

}
کلاس WindowsFormsApplicationBase یک رویداد با نام OnStartupNextInstance داره و موقعی که برنامه رو برای بار دوم یا بیشتر در صورتی که برنامه از قبل باز باشه باز می کنید به جای رویداد OnStartup اجرا میشه.
برای مثال من می خوام اگر برنامه باز هست و یک بار دیگه بر نامه اجرا شد یک پیغام بده.


protected override void OnStartupNextInstance(Microsoft.VisualBasic.Applic ationServices.StartupNextInstanceEventArgs eventArgs)

{

MessageBox.Show("شما تنها یک بار می توانید برنامه را اجرا کنید");

}
خوب همون طور که حتما خودتون فهمیدید این شیء به عنوان یک در بر گیرنده برای app کار می کنه اما قبل از اینکه بگم این شیء رو کجا بسازیم باید یک بار برنامه رو اجرا کنید و خارج بشید.
حالا وارد پوشه پروژه بشید و طبق مسیری که در بالا گفتم فایل app.g.cs رو با notepad باز کنید و متد main() رو پیدا کنید و بصورت زیر تغییرش بدید. توجه کنید که به جای NamProject باید نام پروژتون رو بنویسید.


public static void Main(string[] args) {

NamProject.WpfAppWrapper wpfAppWrapper = new NamProject.WpfAppWrapper();

wpfAppWrapper.Run(args);

}
در آخر هم برنامه رو اجرا کنید . حالا یک بار دیگه اجرا کنید و می بینید که پیغام میده.
از اساتید محترم می خوام که اگر این برنامه اشکال داره یا روش بهتری دارند ما رو مورد لطف شون قرار بدن.
با تشکر