本文目的:根據近期開發的C#軟件,對於軟件的啟動設計談談我的心得。
如下代碼是我設計的啟動軟件的類,應用程序入口也是在這個普通類裡面。
using System;
using System.Threading;
using System.Windows.Forms;
namespace MainClass
{
public class MainApp
{
private static Mutex myMutex;
private static bool requestInitialOwnership = true;
private static bool mutexWasCreated;
/*
以上的部分是聲明進程的互斥
*/
[STAThread]
static void Main()
{
try
{
myMutex = new Mutex(requestInitialOwnership,"Test",out mutexWasCreated);
if(!(requestInitialOwnership && mutexWasCreated))
myMutex.WaitOne();
else
new MainApp();
/*
這裡就是進程互斥的實現。我看過一些人寫的啟功互斥,他們采用的方式是先看當前進程表裡有沒有要啟動的進程;有,看看這個進程是否和要運行的進程來之相同的目錄。
實際上看來,這樣不能徹底解決問題,例如,如果我把程序改名,軟後換個目錄這樣就可以在此運行了,而且時間復雜度偏大。
而以上的代碼:
myMutex = new Mutex(requestInitialOwnership,"Test",out mutexWasCreated);
這裡是申請一個命名互斥,並且返回是否已經有同名的申請了。
if(!(requestInitialOwnership && mutexWasCreated))
myMutex.WaitOne();
如果互斥已經申請過了,阻塞要運行的程序。
*/
}
}
catch(Exception ed)
{
MessageBox.Show(ed.ToString(),"Wrong Convention",MessageBoxButtons.OK,MessageBoxIcon.Error);
System.Environment.Exit(0);
}
}
public MainApp()
{
/*
以下是啟動類
*/
try
{
//這個窗口就是初始化窗口,也可以說是軟件封皮
MainClass.InitializeForm.InitializeForm initializeForm = new MainClass.InitializeForm.InitializeForm();
//在初始化窗口裡面添加檢驗程序,一般是用來初始化數據庫
string result;
if((result = initializeForm.StartTest()) != "")
throw new Exception(result);
else
initializeForm.Close();
//結束初始化窗口,最後進入主窗口
Application.Run(new MainForm.MainForm());
}
catch(Exception ed)
{
MessageBox.Show(ed.ToString(),"#error#",MessageBoxButtons.OK,MessageBoxIcon.Error);
Environment.Exit(1);
}
}
/*
以上代碼就可以實現全部的軟件啟動功能,如果要填加登陸窗口,可以放在初始化窗口之後,也可以放在主窗口類來實現裡。
*/
}
}