今天第一次自文章,如果有寫的不好地方,還請各位高手多多指點。該文章絕對原創,歡迎各位朋友轉載(但是必須註明出處,尊重一下別人的勞動成果,這樣我纔會有激情與動力爲大家奉獻出更多更精彩的文章。)另外如果你覺得我這篇文章寫的好,請您支持我,並能把它轉給你身邊同樣做技術而且可能需要的人的。如果你認爲我的文章寫的不好,麻煩你告訴我,我會改進的。如果你對移動開發那方面感興趣的話或有問題的話,也可以告訴我。雖然我不敢保證百分百的解決你的問題。不過也許你告訴我,說不定我能幫你解決。
今天我想和大家講解一下如何製作一WM項目的安裝程序。主要包括製作可以在智能設備上運行的.cab文件、在桌面上運行的.exe文件、包括對項目的加密處理、生成中文的安裝程序包。如果大家對這篇文章反應比較好的話。我後面還會寫一篇文章如果製作一個在桌面的電腦運行的程序,把移動項目和所有其他組件(比如:NETCFv2.wce5.armv4i.cab、sql.ppc.wce5.armv4i.CAB、sqlce.ppc.wce5.armv4i.CAB)一次性的安裝到智能設備上。
話不多說,回到正題,簡單介紹一下整體思路:
1、 創建智能項目HelloWord。
2、 使用Dotfuscator Community Edition爲Helle Word程序生成的可執行文件進行加密處理。(對可執行文件進行混淆處理,否則源代碼能很容易的被反編譯出來)
3、 創建智能項目安裝程序HelloWordCAB。使用加密過的HelloWord的exe與dll生成智能設備安裝程序HelloWordCAB.CAB。
4、 使用使用軟件WinCE CAB Manager把HelloWordCAB.CAB中的對應文件與文件夾修改爲中文名稱,修改註冊表相關信息。然後生成新的HelloWordCAB_CN.CAB、新的HelloWordCAB_CN.inf文件。
5、 創建桌面安裝程序項目WindowsSetup。
6、 爲HelloWordCAB_CN.CAB書寫安裝配置文件HelloWordCAB_CN.ini。使用WindowsSetup來把程序部署到移動設備上。
下面來具體介紹各個流程。
1、 創建智能項目HelloWord。
創建一個最簡單的移動項目,窗體上有一個按鈕。點擊按鈕顯示"Hello Word!" 。編譯並生成該項目。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace HelloWord
{
public partial class MainFrm : Form
{
public MainFrm()
{
InitializeComponent();
}
private void btnHello_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello Word!");
}
}
}
2、 使用Dotfuscator Community Edition爲Helle Word程序生成的可執行文件進行加密處理。(對可執行文件進行混淆處理,否則源代碼能很容易的被反編譯出來)
a) VS2008->工具->Dotfuscator Community Edition->創建新項目
b) Dotfuscator->輸入 將剛剛生成的HelloWord.exe添加進來
c) Dotfuscator->重命名 中選擇需要混淆的內容
d) Dotfuscator->生成 中選擇目標目錄後點擊“生成”生成記過加密的HelloWord.exe
3、 創建智能項目安裝程序HelloWordCAB。使用加密過的HelloWord的exe與dll生成智能設備安裝程序HelloWordCAB.CAB。
a) 創建一個新“智能設備CAB項目” HelloWordCAB。
b) 把剛剛加密過的HelloWord.exe文件添加到需要部署的目錄中。
c) 編譯項目HelloWordCAB 並生成英文的移動設備CAB安裝包HelloWordCAB.CAB
4、 使用使用軟件WinCE CAB Manager把HelloWordCAB.CAB中的對應文件與文件夾修改爲中文名稱,修改註冊表相關信息。然後生成新的HelloWordCAB_CN.CAB、新的HelloWordCAB_CN.inf文件。
a) 用WinCE CAB Manager打開生成的CAB安裝包HelloWordCAB.CAB。
b) 把文件夾名稱、文件名稱、快捷方式修改爲對應的中文名稱。
c) 生成中文版本的CAB安裝包HelloWordCAB_CN.CAB。
d) 這時候的中文CAB安裝包可以發佈給客戶拷貝到設備上部署了。當然你也可以繼續下去做一個桌面的安裝程序。
5、 創建桌面安裝程序項目WindowsSetup。
創建桌面安裝程序項目WindowsSetup。
6、 爲HelloWordCAB_CN.CAB書寫安裝配置文件HelloWordCAB_CN.ini。使用WindowsSetup來把程序部署到移動設備上。
a) 爲HelloWordCAB_CN.CAB編寫安裝配置文件HelloWordCAB_CN.ini。具體內容如下
[CEAppManager]
Version = 1.0
Component = OpenNETCF WiFiDiscovery
[OpenNETCF WiFiDiscovery]
Description = Sample WiFi Network Discovery Application using the SDF
CabFiles = HelloWordCAB_CN.CAB
b) 用WindowsSetup把HelloWordCAB_CN.CAB安裝到移動設備上。主要運用了ActiveSync中的CeAppMgr
/// <summary>
/// 部署與刪除移動設備上的程序,檢測或安裝PC機上是否安裝軟件ActiveSync
/// 部署程序到移動設備上時候,需要在同一目錄下提供.cab、.inf、.ini文件
/// </summary>
public class ActiveSync
{
#region private
/// <summary>
/// HKEY_LOACL_MACHINE中存放CEAPPMGR.EXE所在目錄的鍵
/// </summary>
private const string CEAPPMGR_PATH = @"Software/Microsoft/Windows/CurrentVersion/App Paths/CEAPPMGR.EXE";
/// <summary>
/// HKEY_LOACL_MACHINE中ActiveSync程序在註冊表中的位置
/// </summary>
private const string ACTIVESYNC_INSTALL_PATH = @"SOFTWARE/Microsoft/Windows CE Services";
/// <summary>
/// HKEY_LOACL_MACHINE中存放WCESCOM.EXE目錄的鍵
/// </summary>
private const string WCESCOMM_PATH = @"SOFTWARE/Microsoft/Windows/CurrentVersion/App Paths/wcescomm.exe";
/// <summary>
/// HKEY_LOACL_MACHINE中ActiveSync程序的安裝路徑
/// </summary>
private const string INSTALLED_DIR = "InstalledDir";
#endregion
#region property
/// <summary>
/// 判斷電腦上是否安裝了ActiveSync軟件
/// </summary>
public static Boolean IsHaveActiveSync
{
get
{
//獲取ActiveSync的註冊表鍵
//如果ACTIVESYNC_INSTALL_PATH不存在,說明該電腦從未安裝過ActiveSync。
RegistryKey keyActiveSync = Registry.LocalMachine.OpenSubKey(ACTIVESYNC_INSTALL_PATH);
if (keyActiveSync == null)
return false;
//獲取程序 CEAPPMGR.EXE 的文件目錄
//如果ACTIVESYNC_INSTALL_PATH存在而WCESCOMM_PATH不存在,說明該電腦安裝過ActiveSync,並已經卸載。
RegistryKey keyWcescomm = Registry.LocalMachine.OpenSubKey(WCESCOMM_PATH);
if (keyWcescomm == null)
return false;
String Wcescomm_Path = (String)keyWcescomm.GetValue(null);
keyWcescomm.Close();
return Wcescomm_Path == null ? false : true;
}
}
#endregion
/// <summary>
/// 根據.ini文件部署程序到移動設備
/// </summary>
/// <param name="arg">.ini文件的絕對路徑,每個路徑前後要加"。多個程序中用空格分開。</param>
public static void RunAppManager(String arg)
{
//獲取CeAppMgr.exe的註冊表鍵
RegistryKey key = Registry.LocalMachine.OpenSubKey(CEAPPMGR_PATH);
if (key == null)
throw new ActiveSyncException(ActiveSyncException.UnFindCeAppMgr);
//獲取CeAppMgr.exe的安裝路徑
String CeAppMgrFullFileName = key.GetValue("") as string;
if (CeAppMgrFullFileName == null)
throw new ActiveSyncException(ActiveSyncException.UnFindCeAppMgr);
//開始執行CeAppMgr.exe程序
Process.Start(String.Format("/"{0}/"", CeAppMgrFullFileName), arg);
}
/// <summary>
/// 卸載移動設備中的程序
/// </summary>
public static void RunAppManager()
{
RunAppManager("");
}
/// <summary>
/// 安裝ActiveSync軟件
/// </summary>
/// <param name="FileName">ActiveSync安裝程序的絕對完整路徑</param>
/// <returns></returns>
public static Boolean SetupActiveSync(String FileName)
{
try
{
//運行安裝文件
Process SetupActiveSync = Process.Start(FileName);
while (!SetupActiveSync.HasExited)
System.Threading.Thread.Sleep(1000);
return IsHaveActiveSync;
}
catch (Win32Exception err)
{
throw new ActiveSyncException(String.Format("系統找不到指定的程序文件。/r{0}", err.Message));
}
}
}
}