简介
不错,不久以前我从 Microsoft 站点订购了 Bicycle Board Games CD。尽管我可以在我的膝上型电脑上下棋,但如果我能够将它加载到我的 Microsoft Windows Powered Pocket PC 电话上,以便可以在任何地点、任何时间、任何场合玩这一游戏,那么确实会很棒。毕竟,如今那似乎是每个人的销售方式。但它并不适用于该游戏。任何地点、任何时间、任何场合 ― 只要我能够携带五磅重的膝上型电脑。
唔,需要实际上可能是发明之母。上述需要 ― 在任何地点、任何时间、任何场合玩游戏 ― 可能已经引起了与其相应的发明:智能设备可编程性 (SDP)。SDP 被添加到了 Microsoft Visual Studio .NET 2003(最终测试版)中,并且将在 2003 年春季的发行版中提供。它最终使开发人员可以使用用 Visual C# .NET 或 Microsoft Visual Basic .NET 编写的托管代码为 Pocket PC 2000 或 2002 以及基于 Windows CE .NET 的设备创建应用程序,并且将来有希望支持更多的语言。
.NET Compact Framework
Microsoft 被要求为嵌入式设备创建 Microsoft .NET Compact Framework ― 它是用于桌面的 Microsoft .NET Framework 的子集。之所以需要这样,是因为 Framework 太大,而嵌入式设备只有有限的内存可用。当第一次使用 Visual Studio .NET 2003 下载托管代码应用程序时,Compact Framework 会自动安装到设备上的 \Program Files\.NET Compact Framework 目录中,以提供库和运行时支持。还可以从 Microsoft 站点下载和安装它,以供使用者使用,但没有针对本文档对此进行测试。
这一切都很完美,但解决一个问题有时会引起另一个问题。如果开发人员希望生成能够在 .NET Compact Framework 和 .NET Framework 这两者之上运行的应用程序,则必须非常小心,因为所使用的任何库通常都必须同时存在于这两者之中,以便该应用程序能够在这两者之上正确地运行。本文档描述了使用 Visual Studio .NET 2003 和 Visual C# .NET 创建可移植应用程序的方法,并且提供了特定于设备的、带有共享平台中立性库的可下载游戏应用程序(其中,大多数源代码和编译代码都可以在 Pocket PC、Windows CE .NET 和桌面计算机上加载),以证明本文档中的概念。
文档动机
我将提供迄今为止我已经撰写的、与 Microsoft 有关的文章的年代列表,以帮助说明撰写本文档的动机。这不仅使我可以对我过去的工作进行大胆的宣传,而且还将说明对于我目前工作的疯狂状态而言,起码还是有一些条理的。
一年多以前,Microsoft 请我撰写一篇文章,以帮助开发人员编写不仅可以在当时的 Pocket PC 上使用,而且可以在那时即将问世的 Windows CE 4.0 上使用的 C++ 应用程序代码。虽然最初我不能肯定如何解决这一问题,但我仍然愿意接手该项目,这主要是因为我手头有空闲时间。在摆弄项目和代码一段时间以后,我撰写了 MSDN 文章 ― Building Native C++ Applications that Will Run on Microsoft Pocket PC and Windows CE .NET Platforms,该文章为任何使用 C++ 的 Microsoft 操作系统提供了常规编码策略。那时,我听说 Microsoft 将要发布某种名为 Compact Framework 的东西。我还听说开发人员将能够使用 C# 在这些基于 .NET 的新平台上进行开发。我已经使用 C# 为桌面编写了几个简单的 Windows 窗体和 Web 应用程序,并且我确实喜欢 C#。虽然引用自己的话通常被视为不良的风格,但我仍然在此列出我进行过的“大胆”预测。
当在 2002 年下半年为 Windows CE 发布 Compact Framework 时,Visual Studio .NET 和 C# 都将成为将来产品开发的良好候选工具。我相信那些不起码对使用 C# 开发新产品(或许甚至包括产品移植)进行评估的公司将会犯错误,因为 C# 已经具有了一个如此丰富的库,并且按照语言语法的性质来说,它具有高度的可移植性。
它实际上并不是一个如此“大胆”的预测,因为这是显然的,尤其是在“摆弄”了 C++ 并且意识到编写可移植代码(即使是跨 Microsoft 平台)并不完全微不足道以后。那时,似乎使用 C# 生成可移植的应用程序很可能要比使用 C++ 容易,即使并未有幸看到将来的工具以及使用 Visual Studio .NET 2003 的最终跨平台应用程序编程接口 (API) 支持。
我想向我第一篇文章中的以下断言添加支持,即作为现代的编程语言,C# 是 C++ 的良好替代语言。尽管我意识到这些编程语言是等效的,我个人仍然相信从应用程序开发人员的角度来看,C# 在易用性方面优于 Java,但我希望在 C# and Java:Comparing Programming Languages 中尽可能客观地表达这一观点。
我在最后一刻被询问是否能够为 2003 年 4 月的 Wireless Communications and Computing Solutions 杂志(以前为 Intel Solutions Journal)撰写一篇 3,000 字的文章 ― Simple, Standard and Smart Device Programmability。当我询问主题应该是什么的时候,我所听到的全部内容是“智能设备的应用程序开发”。当时,我已经安装了 Visual Studio .NET 2003 并开始使用它来试验本文中的想法,因此我决定优先为该 Intel 文章撰写本文档的节略版。在该 Intel 文章中,我生成了一个在桌面以及基于 Windows CE 和基于 Pocket PC 的设备上运行的非常简单的可移植温度转换窗体,但承诺为即将问世的 MSDN 文章生成一个更为复杂的应用程序。该 Intel 文章在本文档张贴前应该联机提供。
我之所以决定撰写本白皮书,主要是因为:C++ 文章中提出的在以后考察 C# 的建议;C# 文章中有关它是一种良好的面向对象编程语言的论点;以及在 Intel 文章中生成一个更为复杂的应用程序的承诺(这些全部都在以前列举过)。它似乎为一系列文章划上了句号。还有另外一个动机。Microsoft 最新的 TechInsight 研究了模块化和小内存足迹等主题。我猜想将会有几篇有关使用 Platform Builder 生成 Windows CE 操作系统映像的文章以满足这一活动要求,但事实上可能很少有应用程序文章将完成这方面的工作。因此,我选择撰写本文以便完成上述文章系列,并且向应用程序开发人员提供一个“声音”。
原始目标
本文的动机推动着本文的原始目标。
1.确定使用 C# 和 Visual Studio .NET 2003 编写可移植应用程序的可行性。
2.生成概念应用程序的接近于“真实”的证据以测试可行性,并且向读者提供一些证据以说明它起码在某些场合下是可能的。
3.试图确定什么是“容易”的以及什么是“困难”的,并且为读者生成一个问题列表。
4.基于上述目标和我所学到的内容创建最后的建议。
推荐的软件和硬件
桌面计算机(满足下列所有软件的最低硬件要求)
1.Microsoft Windows XP Professional,并且安装了 SP1 和所有 Windows 更新
2.Microsoft Visual Studio .NET 2003(最终测试版,如果最终发行版可用则更好)
3.Microsoft ActiveSync 3.6
4.Pocket PC
5.Pocket PC 2000 或 2002
6.基于 Windows CE 的设备
7.Windows CE 4.1 或更高版本
尽管 Pocket PC 和基于 Windows CE 的设备是可选的(因为 Visual Studio .NET 2003 具有这两者的内置模拟器),但最后使用实际的嵌入式硬件来测试真实的应用程序行为总是最好的。我个人使用运行 Windows CE 4.1 的 Siemens SIMpad SL4、运行 Pocket PC 2000 的 HP Jornada Pocket PC 以及 Visual Studio .NET 2003(最终测试版)Pocket PC 模拟器。
使用 Visual Studio .NET 2003 创建项目
尽管认真构建的 Framework 库可以在桌面和基于 Windows CE 的设备之上加载和运行,但建议您在为应用程序导入生成动态链接库 (DLL) 时,改为创建智能设备库。为什么呢?Compact Framework 是桌面版本的子集,而智能设备项目使用 Visual Studio .NET 针对该 Compact Framework 进行编译。因为我们的目标是创建可移植的应用程序,所以采用这种方式可以获得更多的编译时帮助,原因是如果一个 API 可供智能设备使用,则它通常也可供桌面使用,但反之不然。一个例外是 System.Data.SqlServerCE 命名空间中的类,它们可供 Compact Framework 使用,但不可供 Framework 使用。该规则还存在其他几个例外。因为有例外,所以令人遗憾的是,需要同时使用编译器和联机帮助。例如,在生成智能设备库时,如果您试图使用 System.Collections.ArrayList 的 this 索引器,则编译器应该报错,因为对于 Compact Framework 不支持该方法。但是,为了在编写代码和编译之前确定是否可以使用 this 索引器,需要执行下列操作:
1.打开 Visual Studio .NET 2003 Documentation。
2.单击 Index 选项卡,然后键入 ArrayList class。
3.双击 all members 链接。
4.对于 ArrayList 成员面板,滚动至 Item Public Properties 单元格。
5.请注意,Supported by the .NET Compact Framework 文本在相应的属性单元格中不可用。这意味着无法将该调用用于跨平台的可移植代码,因为它只能在桌面上使用。
确定 ArrayList 类是否可以在所有需要的平台上使用
1.打开 Visual Studio .NET 2003 Documentation.
2.单击 Index 选项卡。
3.键入 ArrayList class。
4.双击 about ArrayList class。
5.对于 ArrayList Class 面板,滚动至底部的 Requirements\Platforms 列表。
6. 验证每个应该运行该应用程序的平台都在列表中。
当然,如果某个类或方法并非在每个需要的平