Window Form 的 Web 發行實作

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


程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的魯莽行動。