Window Form 的 Web 發行實作
隨著科技的進步,Web Application 在開發維護上的確十分方便,只要更新主機上的檔案就全部更新了,不像 Client/Server 時代那樣程式版本更新之後,就必需要一一到使用者端的電腦上進行一連串的處理。有些高人,可以透過讀取檔案版本來判斷是否要進行更新,這樣雖然可以達到目的,但不是每一個人都會這樣的技巧。
以下就來透過 Visual Studio 的發行來實作這樣的功能。
首先建立一個空方案,裡面新增了5個專案,其中WideMain的類型為「Windows 應用程式」,其餘的均為「類別庫」。
WideMain 主程式
系統主程式用來呼叫執行其他的子程式,所以在頁面上先放置了四個按鍵來模擬,前三個按鍵可以執行不同的子程式,第四個按鍵則是關閉程式的功能,按下後進行偵測,確定沒有執行任何的子程式,然後才將主程式關閉,這樣來避免資料的遺漏。主程式會呼叫執行A、B、C三個子程式,因此需參考這三個專案。
程式碼:
private void btnExecuteA_Click(object sender, EventArgs e)
{
WideSubA.SubForm frmSubProg = new WideSubA.SubForm();
frmSubProg.Show(this);
}
private void btnExecuteB_Click(object sender, EventArgs e)
{
WideSubB.SubForm frmSubProg = new WideSubB.SubForm();
frmSubProg.Show(this);
}
private void btnExecuteC_Click(object sender, EventArgs e)
{
WideSubC.SubForm frmSubProg = new WideSubC.SubForm();
frmSubProg.Show(this);
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.OwnedForms.Length > 0)
{
MessageBox.Show("請先結束所有子程式");
e.Cancel = true;
}
}
其中必需注意在 Show Form 時,一定要設定擁有者為主程式。否則主程式在關閉程式前的檢查動作 OwnedForms 就會查無任何子表單。
WideSub 子程式
主程式所要呼叫的子程式,範例為四支子程式,主程式可以直接呼叫 A、B、C 子程式,子程式A可以呼叫 C 子程式,子程式B可以呼叫 D 子程式,子程式D可以呼叫 A 子程式,請參考底下簡單的示意圖。
所有的子程式都是設定為類別庫,在編譯後為DLL檔案,無法單獨直接執行。
子程式A
需要執行子程式C,所以加入參考 WideSubC。
程式碼:
private void btnExecuteC_Click(object sender, EventArgs e)
{
WideSubC.SubForm frmSubProg = new WideSubC.SubForm();
frmSubProg.Show(this);
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void SubForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.OwnedForms.Length > 0)
{
MessageBox.Show("請先結束所有子程式");
e.Cancel = true;
}
}
這程式碼與主程式的大同小異,當然在實際運用的程式上,就不會是這麼簡陋的程式碼了。
其他子程式的頁面配置如下:
發行設定
當所有的頁面都已經設定完成,接下來就是最主要的設定了。在主程式的 Properties 頁面,選取發行。
發行資料夾位置,可以設定網站、FTP或是檔案路徑。個人的建議是使用檔案路徑,如果沒有辦法的話,也採用FTP會比較好設定。若是選擇網站的話,網站主機必需要再安裝 Web Deployment Agent Service。當發行資料夾位置的設定不為URL時,就必需要設定安裝資料URL。
安裝模式和設定,建議使用「應用程式也可以在離線時使用(從[開始]功能表啟動)」,畢竟當沒有連線時就不能執行程式,那不就限制太大了吧! (如果有其他考量則例外)
發行版本的編號,可以勾選隨著每次發行自動遞增修定,這樣系統就會在你發行時自動跳號,不過要是在開發期間可能會出現一個非常大的版號 (因為測試發行的次數過多)。
1. 應用程式檔案設定
這裡可以自定哪些檔案要包含在發行動作中,或是哪些檔案不發行。
2. 必要條件設定
設定程式所必需要安裝的 Framework 版本。若使用者缺少了這些程式,可以指定至微軟下載安裝,或是先行下載然後置入安裝路徑中讓使用者安裝,再不然就是指定檔案所存放的位置來進行安裝。
3. 更新設定
線上更新的基制就是在這邊設定。要勾選應用程式應該檢查更新檔,然後設定在應用程式啟動前,這樣可以確保使用者執行的是最新的應用程式。另外指定此應用程式的最小必要版本時,則是強制使用者最少必需要使用到哪一個版本。如果這個最小必要版本等於目前最新的版本,那麼使用者就會被強制更新到最新版本。
4. 選項設定-描述
發行語言:依照程式所設定的語系來處理(適合在多國語系的程式設定)。
發行者名稱:設定開發者的名稱。此設定值會應用在使用者端的程式集內的資料夾名稱。
套件名稱:該程式的名稱。
產品名稱:該程式的產品名稱。
支援URL:設定 Support 說明的網址。
錯誤URL:設定錯誤訊息說明的網址。
4.1 選項設定-部署
部署網頁:設定產生部署安裝的頁面檔。
每次發行之後自動產生部署網頁:勾選後在每次發行完成,都會產生部署的安裝頁面檔。
發行之後開啟部署網頁:勾選後在每次發行完成,會自動開啟部署安裝的網頁。
使用 ".deploy" 副檔名:勾選後,存放在網站主機上的部署檔案,會更名為 .deploy 的名稱,如下圖。
若是使用光碟安裝,在插入光碟後自動啟動安裝程式:勾選後會產生autorun.inf檔案,讓光碟可以自動開啟安裝程式。
驗證上載至Web伺服器的檔案:勾選後上傳網站的檔案,會在上傳完成後驗證是否為正確的檔案。
4.2 選項設定-資訊清單
封鎖應用程式,使其無法透過URL啟動:無法透過網頁URL來啟動執行應用程式。
允許傳遞URL參數至應用程式:可透過URL來啟動執行應用程式,並且傳遞相關的參數。
使用應用程式資訊清單供信任資訊使用:信用應用程式的資訊清單。
排除部署提供者URL:過濾提供者的URL網址。
建立桌面捷徑:在使用者端的桌面上,建立應用程式的捷徑。
4.3 選項設定-檔案關聯
設定相關檔案的其他資訊,如描述、圖示等等。
發行結果
1. 部署的安裝頁面
在設定描述的資訊時,就要決定好名稱,不過因為這個是HTML網頁,也可以自行編輯所顯示的資訊,但不過怎麼修改顯示頁面,一定要記得放置一個安裝的按鍵,透過 A 標籤來開啟 xxxx.application 檔案。
而在 application 檔案的設定中,description 則是在闡述應用程式的資訊。
<description asmv2:publisher="旋轉燕尾夾" co.v1:suiteName="我的套件" asmv2:product="我的產品" xmlns="urn:schemas-microsoft-com:asm.v1" />
publisher 發行者名稱、suiteName 套件名稱、product 產品名稱,這些設定也會應用在使用者程式集內的設定(如下圖)。
安裝過程
安裝完成後,每次執行程式前都會進行更新檢查,當有新版程式時就會出現以下視窗來詢問使用者是否要進行更新。
按下確定鍵就可以進行更新,如果按下跳過,那就會繼續使用舊版程式,除非等到再有更新版時,才會再度詢問是否要進行更新。
範例檔案下載 WideSample.ZIP
程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的魯莽行動。