本文將會把最後的程序給完成,當完成這個程序後,你就可以把你的控制項部署出去了。
本文將會把最後的程序給完成,當完成這個程序後,你就可以把你的控制項部署出去了。
封裝,簽章與部署
在你精心製作完了一個ActiveX控制項後,一定迫不及待的想要部署出去給大家用(例如自然人憑證的元件),但是ActiveX控制項不像我們一般在開發的.NET Framework應用程式,做個安裝檔就可以丟出去的,而是要走幾個步驟:
1. 建立一個安裝程式,將元件封裝到MSI檔內。
2. 設定安裝資訊檔(INF)。
3. 將元件封裝到CAB檔案內。
4. 使用程式碼簽章,簽署元件。
5. 設定網頁引用的codebase路徑,讓用戶端可以自動下載安裝。
首先,我們先為控制項專案建立一個安裝程式,我的安裝專案命名為MyControlInstaller:
建立完成後,請將控制項專案的主要輸出加入安裝專案中,此時安裝專案會將.NET Framework以及控制項的主要檔案加入封裝內,請檢查主要輸出的Register屬性設定是否為vsdrpCOM,這會讓安裝程式在安裝時將組件登錄到用戶端電腦的COM Registry Database內。
檢查完後,請建置這個安裝檔,以產生setup.exe以及MyControlInstaller.msi檔案。
NOTE
如果你看到這個訊息:
無需理會,直接關閉即可。
建置完成後,我們就得到了setup.exe以及MyControlInstaller.msi檔案,接著我們要編寫一個INF資訊檔案,以讓IE在下載CAB解壓縮後,可以得到必要的安裝指令。INF是一個類似以前INI格式的資料檔(可用記事本編輯),它的長相類似於下列指令:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
MyControlInstaller.msi=MyControlInstaller.msi
setup.exe=setup.exe
[MyControlInstaller.msi]
file-win32-x86=thiscab
clsid={C90E96C1-8534-4243-9530-960D9AF982CB}
hook=hook1
[setup.exe]
file-win32-x86=thiscab
[Setup Hooks]
hook1=hook1
[hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\MyControlInstaller.msi" /qn
這個檔案最重要的有幾個地方:
1. [version]區段是給IE來識別,只要IE發現這個區段,就會自動解析這個INF檔案。其中的AdvancedINF=2.0是表示要IE對每個部份依序解析。
2. [Add.Code]區段會提示要將CAB中的哪些檔案加入暫存區,如果封裝中有其他檔案要加入的話,就必須要在這個區段中指明,但我們建議直接將要安裝的檔案全部加入安裝專案即可,讓這個區段只需登記安裝程式所要的檔案即可。
3. [MyControlInstaller.msi]以及[setup.exe]是針對檔案所設定,必須要有一個安裝的執行檔會對應到網頁中的GUID,以上例而言,MyControlInstaller.msi會對應到元件的GUID,IE如果在檔案的設定中發現元件的GUID時,就會讀取這個檔案的其他設定,像是要啟動的安裝程式,或是登錄此檔案(RegisterServer=yes)。
4. [Setup Hook]是指示IE要由什麼指令來啟動安裝程式。本例是[hook1]自訂區段。
5. [hook1]是自訂區段,它會指示IE執行run所設定的指令。
NOTE
你的控制項要視你的控制項需求來編寫這個INF,本例的INF只保證可以安裝此控制項。
有了INF檔案後,接下來我們要將它封裝到CAB檔案,以允許IE自動下載安裝,但很不幸的是,Visual Studio內建的封包專案所產生的CAB檔無法讓IE自動啟動安裝程式,所以我們只能靠以前的Cabinet SDK來做。
NOTE
然而微軟的下載中心已不再提供Cabinet SDK,因此只能由外面的網站來找,像是這裡:
http://www.pixelsplasher.com/_downloads/software/Microsoft-Cabinet-SDK/cabsdk.exe
請將Cabinet SDK下載並解壓縮,會得到SDK的必要資源,其中的cabarc.exe是我們需要的壓縮程式,透過它將setup.exe, MyControlInstaller.msi以及Install.inf(元件的INF檔)封裝成CAB檔,它的指令是:
cabarc n [CAB File Name] [Add File1] [Add File2] [Add File3] …
其執行結果如下圖:
現在,我們已經擁有了一個MyControl.cab檔案,此時,我們就可以將它複製到網站專案中,然後在<object>中加入這個CAB檔案的codebase路徑,如下列指令:
<object id="myControl" classid="clsid:C90E96C1-8534-4243-9530-960D9AF982CB" codebase="MyControl.cab" width="0px" height="0px" />
現在找一台未安裝此元件的電腦來瀏覽此網頁(不可以使用開發電腦,因為這樣無法進行部署測試),理論上應該可以下載控制項,但是你會看到這個提示:
這表示因為Internet Explorer安全性設定所致,基本上我們無法要求用戶端把我們的網站設為受信任網站(內部網站也許可以,但公開網站不可能),要讓Internet Explorer不封鎖的話,只有一個辦法,就是對封裝檔進行數位簽章。雖然我們現階段不可能購買商用的數位簽章(以Verisign的簽章來說,一年要499美元),但我們可以使用makecert.exe來產生一個測試用的自我簽章(Self-signed Certificate):
makecert -sr LocalMachine -n "CN=MyCert" -$ commercial -ss MyCertStore -in MyCert -sv MyCert.pvk -a sha1 MyCert.cer
NOTE
makecert.exe的詳細資訊可參考:http://msdn.microsoft.com/zh-tw/library/bfsktky3(VS.80).aspx
NOTE
您在以-sv參數設定輸出私密金鑰時,會被要求設定密碼:
基本上我們建議你一定要為私密金鑰設密碼,否則一旦私密金鑰被盜取,犯罪者可用它來偽造身份。
當你執行完上述的指令後,你會得到一個公鑰檔(MyCert.cer)以及私鑰檔(MyCert.pvk),私鑰檔是很重要的簽署檔案,開發人員必須要妥善的保護它。
在我們使用簽章工具簽署CAB檔之前,我們還要執行兩個程序,一個是將cer轉換成spc(Software Publisher Certificate),這個可以利用cert2spc.exe來做,它的指令很簡單:
cert2spc [Cert1.cer Cert2.cer Cert3.cer ...] [Output.spc]
本例的指令是:
cert2spc MyCert.cer MyCert.spc
再來是將私密金鑰以及SPC檔合併成PFX(Personal Information Exchange)檔,這個可以用pvk2pfx.exe來做,它的指令則是:
pvk2pfx –pvk [Private Key File] –pi [PVK Password] –spc [SPC file] –pfx [PFX File] –po [PFX Password]
本例的指令是:
pvk2pfx –pvk MyCert.pvk –spc MyCert.spc –pfx MyCert.pfx
當整個程序完成後,我們會得到MyCert.cer,MyCert.pvk,MyCert.spc以及MyCert.pfx檔案,此時我們就可以使用簽章工具signtool來簽署CAB檔案,請使用下列指令:
signtool sign /f MyCert.pfx MyControl.cab
NOTE
如果你對signtool.exe的指令用法不熟,可以用signtool signwizard來啟動數位簽章精靈的對話盒,再依指示做簽署即可。
不過就算你完成了簽署,IE仍然會阻擋你的封裝,因為目前的簽章是不被根憑證授權的,所以你需要在測試用戶端上安裝剛才產生的MyCert.cer到根憑證授權單位。方法是先將MyCert.cer複製到測試用戶端,然後在憑證上按兩下,再按『安裝憑證』,在匯入精靈的第二個步驟中,選擇憑證存放區為『信任的根憑證授權』:
然後完成精靈,你會看到這個提示:
請按『是』接受,此憑證就會安裝到受信任根憑證區。現在請重新瀏覽測試網頁,上方的資訊提示列會改變:
這就表示數位簽章檢查已經通過,此時就能按照一般程序來安裝。然後測試元件是否與在開發電腦般正常運作。
針對Windows Vista以及Windows 7作業系統的電腦
前述的作法可以在Windows XP(瀏覽器為IE6)上正常運作,同時使用者也無須額外的程序,但到了Windows Vista以及Windows 7作業系統,由於ActiveX的安裝行為改變了,再也無法使用msiexec.exe /qn的方式在背景安裝,此時我們就只能修改INF的指令,由setup.exe來啟動安裝程式,下列的INF內容即為可在Windows Vista(IE7)與Windows 7(IE8)上執行ActiveX控制項安裝的INF:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
Installer.msi=Installer.msi
setup.exe=setup.exe
[Installer.msi]
file-win32-x86=thiscab
clsid={…}
hook=hook1
[setup.exe]
file-win32-x86=thiscab
[Setup Hooks]
hook1=hook1
[hook1]
run=%EXTRACT_DIR%\setup.exe
結語
本系列的文章帶領你完成整個 .NET Framework 開發 ActiveX Control 的程序,有了這個程序,你可以再變化它來開發不同的進階控制項 (ex: 自然人憑證控制項)。