ITPub博客

首页 > Linux操作系统 > Linux操作系统 > WM有约:再谈部署(二)

WM有约:再谈部署(二)

原创 Linux操作系统 作者:mysky_1983 时间:2011-05-10 14:37:09 0 删除 编辑

转载

当多语言应用程序遇到CabWiz……
      创建安装包的方法非常简单,如果你对此没有了解,我建议你先去阅读《WM有约(五):部署应用程序》。安装包创建好后,拿到模拟器里安装,安装好后,你可以在"开始"菜单的"程序"里找到应用程序的图标:

图 1
因为我们在简体中文系统上运行应用程序,而简体中文又是应用程序支持的语言,所以应用程序会使用简体中文作为当前语言:

图 2
由于简体中文系统也支持英文,当我们在选项窗体里把当前语言改为英文时,应用程序应该能够正确显示英文界面,然而,事实并非如此!

图 3
问题究竟出在哪里?是当前语言设置出错吗?我修改代码,通过MessageBox显示当前语言,发现已被正确设为英文。当我通过Visual Studio部署到模拟器时,一切正常,而当我通过安装包部署到模拟器时,英文界面就变成上面这样了,这意味着资源文件本身应该是没问题的,但安装包里的资源文件可能出错或者损坏了。我不知道有没有第三方的安装包创建工具,如果没有的话怎么办?难道无法为多语言应用程序创建安装包?
      在Windows Mobile 6 SDK文档里找到这么一段话:
Files that are packaged into a .cab file to be installed on a device are stored by file name, without regard to their installation directory. For this reason, if multiple files within a .cab are given the same name but different install directories, only one of the files will be installed in all locations. To work around this behavior, be sure to use unique names for all files within a single .cab file.
这么看来,CabWiz在创建安装包的时候,误把简体中文和英文资源文件看作一样的了,因为它们的名字是一样的。怎么解决这个问题?Jose A. Garcia Guirado给出了解决方案:
你可以按照他的方法手动修改INF文件和运行CabWiz,也可以使用他的工具自动化这个过程。创建好正确的安装包后,拿到模拟器里测试,这次就正常了:

图 4
值得提醒的是,如果你修改了应用程序,想重新创建安装包,你可以在命令行里运行CabWiz,并向它传递修正的INF文件,或者使用Jose在上面那篇文章里提到的方法,不要重新编译安装包项目,因为这样会覆盖修正的INF文件,并产生有问题的安装包。

让部署更简便
      对于资深WM玩家来说,程序员的任务已经结束了,然而,如果你让普通WM用户把CAB文件拿到手机里安装,他们要么用问题轰炸你,要么把应用程序打进冷宫,显然,这些都不是你想要的结果,怎么办?
一个办法是为应用程序创建一个MSI安装程序,协助用户把应用程序安装到手机里,怎么创建呢?Christopher Tacke写了一篇文章,详述整个创建过程:
然而,这个过程非常繁琐,虽然客户乐了,可也不能苦了程序员,再说,这个办法会把包含Custom Action的DLL安装到桌面电脑里,显得有点多余,说白了,它其实就是调用CeAppMgr.exe,并把描述应用程序的INI文件作为参数传给它,这样的话,为什么不直接创建一个简单的应用程序来执行这个任务呢?
      于是,我用Expression Blend创建了一个Cab Installer:

图 5
Cab Installer在启动时会判断ActiveSync是否已经安装,如果没有安装,它会禁用Install按钮:

代码 1
而CeAppManager则通过查找注册表来确定CeAppMgr.exe是否已经安装:

代码 2
当用户单击Install按钮时,Cab Installer会调用CeAppManager.Install方法来安装应用程序,为了避免用户多次单击Install按钮,Cab Installer在调用CeAppManager.Install方法后会禁用Install按钮:

代码 3
而CeAppManager.Install方法则负责启动CeAppMgr.exe,并把INI文件的完整路径传给它:

代码 4
      编译Cab Installer项目,把CabInstaller.exe、Trombone.cab和Trombone.ini三个文件放在同一个文件夹里,然后运行CabInstaller.exe。当用户单击Install按钮时,Cab Installer将会启动CeAppMgr.exe来完成后续工作:

图 6
      目前,Cab Installer和应用程序紧密耦合,不过,要让它服务其它应用程序也是很容易的,我们也可以把它改成通用安装程序,通过配置文件来指定应用程序的图标和名称、安装程序上显示的文字以及Cab文件等。说到这里,你可能会问:"能否通过它来部署.NET Compact Framework?"我试了一下,答案是可以的,但我不知道如何获知目标设备是否已经安装了所需版本的.NET Compact Framework,这可能会导致重复安装,如果有办法获取这个信息,那么Cab Installer就有一般化的价值了。

尼古丁解决方案
      既然安装了应用程序,不妨运行一下,看看上次的本地化是否足够彻底。噢,有点不妥:

图 7
这个日期和时间格式是英文的,查看DateTimePicker的属性窗口,发现这个格式是当初硬编码进去的,怎么处理?一个办法是通过CultureInfo.DateTimeFormatInfo获取格式信息,并设置DateTimePicker.CustomFormat属性:

代码 5
修改一下主窗体的构造函数,然后重新部署应用程序,再来看看运行效果:

图 8

图 9
简体中文的格式没问题了,却轮到英文的格式出问题了!为什么会这样?原来,DateTimePicker只是使用我们提供的格式,而格式里面指代的"上午符号"和"下午符号"则从设备的区域设置里获取,假如我们在设备的区域设置里把它们分别设为"OK"和"KO",那么我们的应用程序也会跟着改:

图 10

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/750152/viewspace-694914/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-05-10

  • 博文量
    3
  • 访问量
    3282