1.5.2 设计规范
由于.NET Compact Framework的局限性,某些要求对托管代码开发者来说被放宽了,例如,在程序中提供退出选项或支持平台的“帮助”菜单。现在,您可以决定是否在程序中添加退出选项。这个决定基于设备的使用模式和目标用户的需求。在Compact Framework 2.0版本中,能够通过处理来自窗体的HelpRequested事件对“帮助”做出支持(正如本章前面所述)。使用这种内建机制的优点是,实现了与其他程序的一致性,也不至由于添加“帮助”按钮,而扰乱菜单或工具栏。
1.6 全局程序集缓存
全局程序集缓存(Global Assembly Cache,GAC)用于集中存储针对.NET的.dll文件,这样便可以被多个程序共享。要安装到GAC,程序集必须由一个密钥对进行签名,以获得一个强名称。用密钥对对程序集进行签名,便能确保如果两个同名的程序集安装在GAC中,会由于版本或密钥签名不同而被区别看待。
1.6.1 对程序集进行强命名
要对程序进行强命名,不仅要赋予它们唯一的版本号,还要提供身份验证。因为,要生成一个匹配签名的程序集,您必须给程序集相同的密钥对。而要将您的程序集用强名称签名,需要一个密钥对文件。通常,只创建一个密钥对文件,然后就可以使用它对任何托管程序集实施强命名操作。这个用于.NET程序集的强命名机制,无论对桌面,还是对设备来说都是相同的。打开程序集项目的项目属性窗口,在“签名”选项中,选择“签名”选项。如果没有密钥文件(扩展名为.snk的文件),可以在“选择强名称密钥文件”中选择“新建”生成一个。如图15-8
图1-8项目签名选项中选择密钥对文件
1.6.2 何时以及如何使用全局程序集缓存
不是所有的.dll文件都有必要安装在GAC中。将.dll文件与您的程序安装在一起,可以确保程序不会由于系统中其他程序文件的补丁的安装而自身遭受破坏。然而,您可以将一些具有普遍性的.dll文件安装在GAC中,这样便能缩小安装程序的大小。框架所有的基础类库和Microsoft SQL Server程序集都安装在GAC中。
程序集通过Windows目录下的一个文本文件添加到GAC中。此文件只包含要添加到GAC中的.NET Compact Framework程序集列表。当.NET Compact Framework应用程序启动时,系统会搜索新的.gac文件,如果发现,它会导入指定的.dll文件。如果某个.gac文件被移除,注册过的.dll文件也会从GAC中移除。
通过.cab文件项目可以很容易将您的程序集添加到GAC中。在“文件系统编辑器”中,右键单击“目标计算机上的文件系统”,选择“添加特殊文件夹”。然后,选择菜单底部的“Global Assembly Cache文件夹”。将托管.dll文件拖放到此文件夹,这便可以自动生成必要的.gac文件来注册它们。如果您的程序集没有强名称,生成时会出现一个错误。用这个方法将程序集安装到GAC时,唯一需要注意的是,此文件直到下一次.NET Compact Framework运行库被启动时才会被移入。然而您可以通过调用带有/refresh 标记的Cgacutil.exe命令使其立即执行。
1.6.3 学用组件cesetup.dll
Windows Embedded Compact 7中的cab安装引擎有在安装过程中添加自定义操作的机制。例如,您若添加一个自定义操作,检查设备上是否有必要的组件,或者执行一些不能够直接由.cab文件程序包完成的一些更改(例如,删除一些文件来锁定设备,正如本章前面所述),您可以通过创建针对.cab文件项目的本地代码(C++).dll文件,添加自定义操作。这个.dll文件必须暴露4个特殊的方法,将分别在安装和卸载过程的开始与结束时调用。您可以通过“Win32智能设备项目”来创建这个所需的.dll文件。
接下来,必须完成一些工作:在项目的主.cpp文件中,添加下面这行代码:
#include "ce_setup.h"
然后,逐一定义由安装程序调用的4个方法:
codeINSTALL_INIT
Install_Init(
HWND hwndParent,
BOOL fFirstCall,
BOOL fPreviouslyInstalled,
LPCTSTR pszInstallDir
)
{
return codeINSTALL_INIT_CONTINUE;
}
codeINSTALL_EXIT
Install_Exit(
HWND hwndParent,
LPCTSTR pszInstallDir,
WORD cFailedDirs,
WORD cFailedFiles,
WORD cFailedRegKeys,
WORD cFailedRegVals,
WORD cFailedShortcuts
)
{
//Hide games and File Explorer.
CreateDirectory(_T("\\Windows\\Start Menu Backup"), NULL);
CreateDirectory(_T("\\Windows\\Start Menu Backup\\Programs"), NULL);
MoveFile(_T("\\Windows\\Start Menu\\Programs\\File Explorer.lnk"),
T("\\Windows\\Start Menu Backup\\Programs\\File Explorer.lnk"));
MoveFile(_T("\\Windows\\Start Menu\\Programs\\Games"),
T("\\Windows\\Start Menu Backup\\Programs\\Games"));
//Force a refresh of the GAC.
CreateProcess(_T("cgacutil.exe"),_T("/refresh"),
NULL,NULL,FALSE,0,NULL,NULL,NULL,NULL);
return codeINSTALL_EXIT_DONE;
}
codeUNINSTALL_INIT
Uninstall_Init(
HWND hwndParent,
LPCTSTR pszInstallDir)
{
return codeUNINSTALL_INIT_CONTINUE;
}
codeUNINSTALL_EXIT
Uninstall_Exit( HWND hwndParent)
{
//Restore games and File Explorer.
MoveFile(_
T("\\Windows\\Start Menu Backup\\Programs\\File Explorer.lnk"),
T("\\Windows\\Start Menu\\Programs\\File Explorer.lnk"));
MoveFile(_T("\\Windows\\Start Menu Backup\\Programs\\Games"),
T("\\Windows\\Start Menu\\Programs\\Games"));
//Refresh GAC.
CreateProcess(_T("cgacutil.exe"),_T("/refresh"),
NULL,NULL,FALSE,0,NULL,NULL,NULL,NULL);
return codeUNINSTALL_EXIT_DONE;
}
最后,为导出这些入口点,在项目中添加一个模式定义文件,命名为native.def。将以下内容填入其中:
EXPORTS
Install_Init
Install_Exit
Uninstall_Init
Uninstall_Exit
如果您想测试这个.dll文件,看看它何时被调用,可以在每一个方法中添加一个消息框(message box)。
要使这个文件在安装过程中被调用,将主输出添加到设备.cab项目的“应用程序文件夹”中。在.cab文件项目的主属性中,您可以将这个.dll文件指定为“Windows Embedded Compact 7安装程序”。如图15-9
图1-9
CESetupDLL项目的项目输出,事先已添加到安装程序项目中
这个安装程序.dll文件所做的工作是,将一些关键程序的快捷方式移走,对用户打开设备上的游戏和“文件浏览器”应用程序造成一定障碍。您也可以强制刷新GAC,如此一来,这个.dll文件会被立即注册(无需等待下一次.NET Compact Framework运行库启动)。
1.6.4 测试.cab文件
现在,.cab文件包含在设备上安装程序所必需的所有元素。您可以使用ActiveSync(或者Windows 7中的“Windows移动设备中心”)来浏览设备的文件系统,并将这个.cab文件复制进去。然后,在设备上,用“文件浏览器”找到并启动这个.cab文件,安装您的应用程序。在成功安装并运行程序后,接下来便是生成桌面安装程序了。
1.7 生成桌面安装程序
上一节描述了如何创建设备.cab安装程序,可以使用它将文件手动部署到设备上,并安装这个产品。许多设备用户在他们的桌面计算机上安装有ActiveSync,它能自动安排安装过程。在本节中,我们会创建一个示例安装项目,最终会得到一个能够在桌面计算机上运行的程序包,使用ActiveSync部署并安装那个.cab文件。在“文件”菜单中,选择“新建”|“项目”,然后是“其他项目类型”|“安装和部署”,最后选择“安装项目”
1.7.1 添加自定义的.cab项目
可以将输出从解决方案的另一个项目中添加到“应用程序文件夹”中。选择“添加”|“项目输出”,确保您的设备.cab项目已被选择, 如图15-10
图1-10
在设备安装项目中添加项目输出
1.7.2 添加其他应用程序文件
与添加.cab文件的方式相同,可以添加安装在桌面计算机上的与您的应用程序关联的其他文件(例如,帮助文件或者配套程序)。
1.7.3 使设备端的安装自动进行
您可以将某个程序安装到ActiveSync的“添加/删除程序”,或Windows 7的“Windows移动设备中心”,具体做法是提交一个正确配置的.ini文件,它描述您的应用程序和.cab(或要安装的)文件。虽然“添加/删除程序”允许其中罗列若干.cab文件,但这个功能只是用来支持同一个组件所针对的不同CPU或平台——您不能使用这个方法来部署多个截然不同的.cab文件。如果您的.cab文件是针对Windows Mobile创建的,那么只受ARM(Advanced RISC Machines)架构支持,因此,您不必处理多个.cab文件。
这个.ini文件有一个CeAppManager区段,它包含AppManager版本(仅1.0有效)和组件名的描述。接下来的一个区段的名称与在第一个区段中由Component属性所指定的完全相同。这个区段包含了一个较长的对程序包的文本描述,也可以包含设备端卸载时所要使用的程序包名称,最后是组成此程序包的.cab文件,各文件用逗号隔开。
[CEAppManager]
Version = 1.0
Component = Chapter6
[Chapter6]
Description = Chapter Six Example
Uninstall = Chapter6
;Because there are multiple .cab files specific to a CPU type,
;these files are relative to the installation directory.
CabFiles = Chapter6Cab.cab
The Setup project types in VS2008 do not include the capability to automatically
install the device side component; therefore, we need to add a custom action to pass
this INI file to CeAppMgr.
1.7.4 添加自定义安装操作
使用Visual Studio 20085生成桌面安装程序后,只需启动可执行文件,就可以对程序包进行安装。然而,在我们的示例中,需要.ini文件来启动CeAppMgr,用这个配置文件可以自动将设备安装程序部署到连接的设备上。您可以通过托管安装.dll文件、可执行文件或脚本提供自定义操作。在这里,我们倾向于使用VBScript(Visual Basic Scripting Edition)文件,因为所要执行的任务相对简单,且它不依赖于桌面计算机上的.NET Framework。下面是一个可以从自定义操作中进行调用的VBScript文件,它非常简单,仅有两行组成:
Set objShell = CreateObject("Wscript.Shell")
objShell.Run(Session.Property("CustomActionData"))
Wscript.Shell是一个VBScript运行库组件,它提供了一系列外壳方法。这里,我们使用了Run,传递给它一个字符串,这个字符串包含程序名,也可以填入用空格分隔的参数。这很像托管代码中的System.Diagnostics.Process.Start方法。CustomActionData是一个指定的属性,通过这种方式,您可以在安装项目中为每个自定义操作进行设置。
通过“自定义操作编辑器”,您可以在安装的不同阶段设置要执行的任务。要运行“添加/删除程序”工具,必须检测ActiveSync的CeAppMgr组件路径。而要取得ActiveSync的路径,在安装程序开始操作中,要添加一个注册表检测功能。有了这个注 册表检测功能,如果ActiveSync指定版本没有安装在计算机上,您便可以取消程序包的 安装。ActiveSyncRegistrySearch在HKEY_LOCALMACHINE\SOFTWARE\Microsoft\ Windows Embedded Compact 7 Services中搜索InstalledDir的值,它存储在一个叫ACTIVESYNCDIR的指定值中。这个自定义安装操作运行在安装程序“提交”状态下,所以,仅当所有其他程序包都成功安装后,它才会运行。它将下面这行字符串传到VBScript中:
"[ACTIVESYNCDIR]\CeAppMgr.exe" "[TARGETDIR]\Terminal.ini"
1.7.5 运行安装程序
在生成并创建.msi文件之后,便可以启动这个Windows安装程序包来安装应用程序了。这个安装程序包会将所有文件安装到桌面计算机上,然后启动ActiveSync安装程序。如果设备已连接,安装将自动进行,否则,用户会收到一条消息,通知他这个安装过程会在下次设备连接时进行。
如果在Windows 7上运行安装程序,这个系统有一个新功能“用户账户控制”(User Account Control),安装程序将会暂停,直到用户提供“管理员”凭据后才允许继续安装。
1.8 小结
本章描述了如何将“帮助”内容添加到您的项目,研究了锁定目标设备用户接口的方法,并讲解了构建安装程序的过程。由安装程序生成的.cab文件,可以使用存储卡、Web链接或电子邮件,也可以通过手动复制的方式,将其部署到设备上。