系统全面的教你做Windows Mobile程序的安装程序
昨天刚加入博客园,今天第一次自文章,如果有写的不好地方,还请各位高手多多指点。该文章绝对原创,欢迎各位朋友转载(但是必须注明出处,尊重一下别人的劳动成果,这样我才会有激情与动力为大家奉献出更多更精彩的文章。)另外如果你觉得我这篇文章写的好,请您支持我,并能把它转给你身边同样做技术而且可能需要的人的。如果你认为我的文章写的不好,麻烦你告诉我,我会改进的。如果你对移动开发那方面感兴趣的话或有问题的话,也可以告诉我。虽然我不敢保证百分百的解决你的问题。不过也许你告诉我,说不定我能帮你解决。
今天我想和大家讲解一下如何制作一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));
}
}
}
}