首页 / 软件开发 / .NET编程技术 / 共享代码:编写同时适用于移动和桌面应用程序的代码
共享代码:编写同时适用于移动和桌面应用程序的代码2011-12-14 msdn Daniel Moth在过去几年,尽管开发人员一直在为 Windows® 构建 Microsoft® .NET Framework 客户端应用程序,但是许多人都不知道他们还可以使用相同的技能和工具集为 Windows Mobile® 创建应用程序。但是 Windows Mobile 当时还没有在企业内广泛使用,因此编写面向移动设备的自定义应用程序的需求还不是很大。如今,为了满足大量的需求,许多桌面开发人员开始涉足移动开发。遗憾的是,尽管跨平台共享 .NET 代码相当容易,但许多这样的机会都没有得到利用。无论原始应用程序是为 Windows 还是为 Windows Mobile 编写的,有很多原因可能会促使您跨这两种平台共享业务逻辑。您可以从其中任一个平台开始,迁移到另一个平台。如果应用程序当前是在现场的便携式计算机上运行,则在移动设备上运行可能是个不错的选择,反之亦然。如果您的产品与竞争者的产品类似,通过将其扩展到新的平台,可以使您在竞争中占据优势。还有一个额外的好处,就是通过编写在桌面上执行的代码,您可以利用不能用于智能设备项目的开发人员工具。编写面向具有不同外观造型(不同的屏幕尺寸、方向、触摸屏等)的 Windows 设备的跨设备代码应用程序时,可以利用本文中介绍的技术和原理。平台差异当我想到 .NET Framework 时,我会想到工具、语言、库和运行时引擎。这四种元素中的差异会影响编写跨平台代码的目标。幸运的是,我们对桌面和移动应用程序所使用的工具是相同的:Visual Studio®。对于 Visual Studio 的每个版本,Visual Studio for Devices 团队继续添加用于设备开发的新功能,并确保重要的新桌面开发功能对于移动设备开发也可以正常使用。(对于设备开发,您需要使用 Visual Studio 2005 Standard 或更高版本。)从语法角度看,两种平台都完全支持 Visual Basic® 和 C#。但是如果您计划使用 Visual Basic,我们需要提醒您 Microsoft.VisualBasic.Compatibility 程序集和隐式后期绑定不受支持。前者是对从 Visual Basic 6.0 迁移的桌面项目使用的程序集;如果您通过在 Visual Basic 项目中启用 Option Strict On 来遵循最佳实践,后者不是问题。还要意识到托管 C++ 也不受支持(虽然相同的 IDE 可用于本机设备项目)。通过引用正确的程序集和确保其编译器不生成 .NET Framework 精简版公共语言运行库 (CLR) 不支持的 IL 操作码,第三方语言可以添加对 .NET Framework 精简版的支持。冲突的 IL 操作码包括:jmp、calli、refanyval、refanytype、mkrefany、arglist、localloc、unaligned 和 tail。需要注意的是,尽管垃圾收集器和实时 (JIT) 编译器的实现在 .NET Framework 精简版中与在 .NET Framework 中不同,但是它们仍然起到相同的作用并为托管代码提供相同的服务。与任何主流编程框架一样,.NET Framework 附带有大量类库。.NET Framework 精简版仅占用了 20% 的资源就实现了 .NET Framework 中 80% 的相关功能。与 .NET Framework 相比,.NET Framework 精简版中不包含的主要方面包括:ASP.NET、CLR 宿主、代码访问安全 (CAS)、二进制序列化、Reflection.Emit 以及 CodeDOM。Windows Presentation Foundation 和 Windows Workflow Foundation 很快就将不受支持,但是 .NET Framework 精简版 3.5 版中将提供 Windows Communication Foundation 的精简版。在 3.5 版本中,还将支持 LINQ to Objects、LINQ to XML 以及 LINQ to DataSet,但是不支持任何其他 LINQ 类型。然而,大多数情况下,并不是因为缺少这些大的方面而导致出现问题。通常,问题是由于某些受支持的命名空间不具备您所需的所有类引起的,更重要的是,某些类不具备您所需的所有成员。稍后,我将介绍一些解决方法。反之也是如此。也就是说,.NET Framework 精简版从严格意义上说不是 .NET Framework 的子集;它实际上添加了一些自己的成员。有四种特定于设备的程序集:System.Data.SqlServerCe、System.Net.IrDA、Microsoft.WindowsMobile.DirectX 以及 Microsoft.WindowsCE.Forms。SqlServerCe 包含的类用于处理设备上的内存数据库;IrDA 包含的类用于针对红外线进行编程;DirectX® 用于处理丰富图形,主要适用于游戏编程;Forms 拥有大量特定于设备的 GUI 类。除了这些特定于设备的程序集之外,还有一些适用于 Windows Mobile 5.0 和更高版本的特定于设备的 Windows Mobile API,它们随 Mobile 平台一起提供。稍后,我将向您介绍如何处理在一种框架中存在,在另一种框架中不存在的类。当然,桌面和移动设备上的输入方法是不同的,因此,您不必担心移动设备上的键盘快捷方式、工具提示等。此外,移动窗体不能调整大小,始终是全屏,这也会影响您在应用程序的窗体间导航的方式。最后,最明显的差别是设备的屏幕尺寸要小得多。为了消除这种影响,最好不要在这两种平台间共享应用程序的 UI 层,而是创建特定于平台的用户界面,仅共享业务逻辑。