11(共 11)对本文的评价是有帮助 - 评价此主题

Windows Phone 应用平台兼容性

2013/12/5

适用于: Windows Phone 8 | Windows Phone OS 7.1

通常,Windows Phone 应用平台支持在 Windows Phone 8 上运行面向 Windows Phone OS 7.1 的应用,而无需进行修改或重新编译。但是,您应该在 Windows Phone 8 模拟器或设备上测试您的应用,以确保应用能够按预期运行。性能改进;支持速度更快的多核硬件;Windows Phone 8 中的装饰差异会影响您 Windows Phone OS 7.1 应用在 Windows Phone 8 上的行为与外观。

此外,在其他情况下,Windows Phone OS 7.1 应用的行为可能与其在 Windows Phone 8 上运行时有所不同。一种情况是由于源不兼容性和已应用的突发模式更改。另一种情况源于二进制不兼容性,也称为重大更改。在大多数情况下,由于突发模式,源不兼容性差异对面向 Windows Phone 的特定版本的开发人员是透明的。然而,运行时行为的更改(视为重大更改)或为 Windows Phone 8 重新编译 Windows Phone OS 7.1 应用时发生的更改都可能导致应用兼容性问题,并且突发模式将不再适用。此主题详细描述了 Windows Phone 8 中的突发和重大更改,并列出了会影响到开发人员的已知重大更改和突发。

说明注意:

在本文中,对 Windows Phone OS 7.1 的引用也适合 Windows Phone OS 7.0。

本主题包含以下各节。

Windows Phone 8 引入了可能导致现有应用的不兼容问题的功能改进或行为更改。对于某些功能和 API,Windows Phone 应用程序平台没有引入重大更改,而是提供保留传统行为的突发模式,并根据该应用最初生成和测试时所针对的 Windows Phone 版本在合适的地方应用它。如果面向的版本是 Windows Phone OS 7.1,则突发模式模拟相同的行为或使用与 Windows Phone OS 7.1 相同的代码。换言之,应用如同在其最初针对的版本进行运行时测试一样在 Windows Phone 8 中运行。

说明注意:

如果为 Windows Phone OS 7.1 开发的第三方库被用于 Windows Phone OS 7.1 应用中,它将利用突发。但是,如果该库被用于 Windows Phone 8 应用程序中,它将在突发模式外运行。

如果面向 Windows Phone OS 7.1 的应用的源代码被重新编译以便面向 Windows Phone 8,则突发模式将不再有效。因为现在应用面向 Windows Phone 8,它在所有情况下均执行新代码。突发模式不是一个选择性或可配置的功能 - 它根据应用面向的平台自动应用。

对于二进制不可兼容性或重大更改,当面向 Windows Phone OS 7.1 的应用在 Windows Phone 8 上运行时,其操作由于运行时行为的差异而有所不同。这些行为差异不是突发的,这意味着您将需要修改应用以使之在两个平台上都能同样运行。例如,这些更改可能是应用外观的略微不同,或者可能是代码执行顺序的不同。

下表列出了 Windows Phone OS 7.1 和 Windows Phone 8 平台之间不受突发模式影响的重大更改。其中一些更改可能需要对应用进行修改,从而使之在 Windows Phone OS 7.1 和 Windows Phone 8 上可以同样运行。有关更改的影响以及应如何修改源代码的信息,请参见表的“影响”一列。

由于 Windows Phone 8 中存在许多更改,您可能会在升级项目时遇到一些问题。有关您需要采取的步骤和您在升级项目时可能会遇到的问题的更多信息,请参见如何将应用项目升级到 Windows Phone 8

Windows Phone 特定的功能

下表列出了 Windows Phone 核心功能中的重大更改。

功能

更改

影响/解决方法

“后退”按钮导航

在用户单击显示在应用中的某个广告并连续单击“后退”按钮两次后,应用将在 Windows Phone 8 中退出。在 Windows Phone OS 7.1 中,用户在应用后退堆栈间导航。

这是 UI 行为中的一个更改,且没有解决方法。但是,您必须确保应用逻辑删除的正确性,以防用户意外退出应用。

后台文件传输

并发文件传输的数量限制从 5 上升到 25。

在到达限值 25 之前不会发生异常。在到达上限之前,您无需移除请求。

后台文件传输

在 Windows Phone 8 中,当应用处于前台时,后台传输服务将在以下数据网络上进行传输。在 Windows Phone OS 7.0 中,不论应用是否正在前台中运行,传输不会发生在这些数据网络上。

  • 2G

  • EDGE

  • 标准

  • GPRS

在 Windows Phone 8 中,当应用不处于前台时,传输将不在这些网络上进行。HttpWebRequest 对象同样有此限制,因此,执行自己的传输并不比使用后台传输具有更多优势。在 3G 和更高的网络中,假设所有其他条件都符合,那么无论应用是否正在前台运行,后台传输都将在 Windows Phone 8 或 Windows Phone OS 7.1 上继续。

不会在 Windows Phone OS 7.1 中发生的后台传输将会在 Windows Phone 8 中发生。如果计划针对两种平台,应在代码中加以说明。

选择器

以前,在导航到正在执行的“选择器”的同时调用选择器的 Show 方法将引发异常。现在,对 Show 的第二次调用将在不提示的情况下失败。

您无需将对选择器的 Show 方法的调用放置在 try 块中。

CompassReading

CompassReading 结构的 TrueHeadingMagneticHeading 属性返回类型 Double 值。在 Windows Phone OS 7.1 中,返回的 Double 值无精度;例如以 122.0 度返回。在 Windows Phone 8 中,这些属性返回的 Double 值带精度;例如以 122.12345 度返回。

在进行操作或转换时,确保不会从这些数值中去除精度;例如,在将其转换为字符串然后再转换为 Double 值时,可能会去除精度。

数字版权管理 (DRM)

在 Windows Phone 8 中,应用不能将受 DRM 保护的视频作为纹理正常使用;视频默认为黑屏显示。在 Windows Phone OS 7.1 和早期的版本中,受 DRM 保护的视频可作为构图纹理访问。视频的组成将与场景中的任何其他纹理内容一样。标准视频叠加控件则不受影响。复合器可正确混合这些帧。

显示帧的唯一方式是将其传递给复合器,用于将绘图用作叠加图面。在一下每一种情况中,视频均不能通过叠加呈现。

  • 非基数旋转(0、90、180 和 270 度以外的度数)

  • 部分透明

  • 3D 投影(包含视频的移动中的对象)

FM 收音机

Windows Phone 8 不支持 FM 收音机功能。如果您在 Windows Phone 8 应用中使用 FM 收音机 API,将发生 RadioDisabledException

如果应用调用 FM 收音机 API,请检测运行该应用的手机的 OS 版本,如果设备为 Windows Phone 8 手机,请禁用应用的此部分。否则将发生异常,并且如果应用无法处理该异常,应用将意外退出。

LayoutUpdated 事件

Windows Phone OS 7.1 与 Windows Phone 8 之间的事件顺序排列并不完全一致。因此,初始 LayoutUpdated 事件在 Windows Phone 8 上首次引发时并无正确尺寸。第二次引发时,尺寸即可恢复正确。

如果在 LayoutUpdated 中使用尺寸,通过首先检查 ActualWidthActualHeight 超过 0 且有效,可解决这一差异。如需一些解决这一差异的示例代码,请参见 LayoutUpdated 事件。

ListBox 控件

如果您正在 Windows Phone 8 项目中工作,ListBox 控件不会在工具箱中显示。建议使用 LongListSelector 控件来显示 Windows Phone 8 应用中项目的列表。

您可以手动添加 XAML 编辑器中的 ListBox 控件,或使用 LongListSelector 控件。

本地数据库

在 Windows Phone 8 中,您不再可以使用只读连接字符串访问独立存储中的本地数据库,除非您访问的是安装文件夹。

如果您尝试使用只读连接字符串访问独立存储中的本地数据库,会发生 NotSupportedException

ManipulationCompleted 事件

在 Windows Phone 8 中,如果试图为 LongListSelectorPanoramaPivot 控件处理 ManipulationCompleted 事件,事件处理程序代码不会运行。在 Windows Phone OS 7.1 中,将运行事件处理程序代码。

在 Windows Phone 8 中,LongListSelectorPanoramaPivot 是此框架的一部分。ManipulationCompleted 事件标记为在 Windows Phone 8 进行处理,以使 UI 更具响应性。

如果需要在 Windows Phone 8 和 Windows Phone OS 7.1 中处理 ManipulationCompleted 事件,请使用 AddHandler 方法。有关更多信息,请参见 ManipulationCompleted 事件。

MessageBox.Show(String)

MessageBox.Show(String, String, MessageBoxButton)

如果从应用 ActivatedLaunching 事件处理程序调用 Show(String) 方法,会引发 InvalidOperationException 并显示消息“显示 MessageBox 时出错”

OnNavigatedTo(NavigationEventArgs) 方法调用 Show(String) 方法。

MessageBox.Show(String)

MessageBox.Show(String, String, MessageBoxButton)

在 Windows Phone 8 中,如果您调用 Show 中的 OnBackKeyPress(CancelEventArgs)BackKeyPress 事件的处理程序,应用将退出。

您可以通过在不同的线程上调用 Show 来解决此问题,如以下步骤所述。

  1. 重写 BackKeyPress 或为 BackKeyPress 事件创建处理程序。

  2. Cancel 设置为 true 以取消后退键按键操作。

  3. 调度一种方法,显示 MessageBox

  4. 如果用户选择退出应用,请调用 Terminate(),否则不要执行任何操作。

MessageBox 控件

MessageBox 控件中为 Windows Phone 8 更新间距、边距和填充。

间距、边距和填充的变更会影响到控件在应用中的布局。测试在 Windows Phone 8 上使用 MessageBox 控件 Windows Phone OS 7.1 的应用,确保外观不会发生改变。

Microsoft.Phone.Media.Extended 程序集

Windows Phone OS 7.1 手机设备上随附的 ROM 中的 Microsoft.Phone.Media.Extended 程序集在 Windows Phone 8 手机上不可用。

如果您使用反射访问此程序集中的 API,由于它们不是公开的,您的应用可能无法在 Windows Phone 8 设备上运行。移除对此程序集的调用并使用公开的媒体 API

网络

在 Windows Phone 8 中,由于 Windows Phone 8 客户端可以处理 Vary 标头和缓存响应,完成 Web 服务调用可能比在之前的版本中要快得多。

此更改应具有最小影响。然而,如果正在调用 Web 服务,代码不应依赖于所需时间超过一秒的下载。当检查响应时间时,由于时间可能小于 1 秒,应使用毫秒和浮点数。

Panel 控件

在 Windows Phone 8 中,当源自 Panel(如 CanvasGridLengthStackPanel)的控件高度超过 2560,Background 画笔会设置为黑色,即使背景设置为另一种不同颜色也会如此。

对于此问题没有解决方法。

照片选择器任务

在 Windows Phone 8 中,照片选择器任务会在应用的独立存储的顶级创建名为“PlatformData”的目录。

如果面向 Windows Phone OS 7.1 的应用被部署到运行 Windows Phone 8 的手机,或者您创建了一个面向 Windows Phone 8 的新应用并且该应用使用照片选择器任务,在应用循环访问独立存储的内容并且您希望跳过由系统创建的目录时,则跳过“PlatformData”和“Shared”。

系统托盘中的 ProgressIndicator

在 Windows Phone OS 7.1 中,系统托盘中更新进度指示器的代码已同步。在 Windows Phone 8 中,更新进度指示器的代码现在已同步。

在一些情况中,这一变更会导致 Windows Phone 8 内的进度指示器不再显示在系统托盘中。例如,如果使用 ProgressIndicator 类来设置进度指示器,并立即阻止 UI 线程(例如执行资源密集型工作),则不会再显示进度指示器。这是因为系统尚无法处理更新进程指示器的请求。

对于此问题有一个潜在解决方法。如果您使用较小超时与无限时间的计时器,然后在计时器回调内调用 Dispatcher.BeginInvoke 以安排资源密集型工作,这将处理信息排队并允许进度指示器在开始执行资源密集型工作前得到更新。

安全套接字层 (SSL)

当应用向 web 服务或 web 站点发出 SSL 请求时,面向 Windows Phone 8 的应用会联系站点证书发布人,获取安全证书吊销列表。在 Windows Phone 8 应用中,这一额外网络请求增加了 SSL 请求需要的时间。如果证书吊销列表并未及时收到,SSL 请求超时,在速度慢或不可靠的网络连接下尤其常见。

确保应用能够处理可能出现的超时,并重试请求或者在缺少请求数据的情况下继续操作。

Slider 控件

在 Windows Phone 8 中,Slider 控件与其 API 改变较大。

HorizontalLargeIncreaseHorizontalLargeDecreaseHorizontalThumbVerticalLargeIncreaseVerticalLargeDecreaseVerticalThumb 已经从控件模版中移除。

对应的新模版部分是 HorizontalFillHorizontalTrackHorizontalCenterElementVerticalFillVerticalTrackVerticalCenterElement。新模版部分都属于类型 FrameworkElement

如果您在准备升级到 Windows Phone 8 的应用中重设了 Slider 控件模版,可能需要更改控件模版以应对移除或添加的模版部分。

TextBox 控件

在 Windows Phone 8 中,当 AcceptsReturn 属性值为 false 时(即当 TextBox 并非多行 TextBox 时),Enter 键在 TextBox 内引发的事件的行为会有所不同。在面向 Windows Phone OS 7.1 的应用中,按下 Enter 键未得到 TextBox 处理,则会产生 TextInput 事件。在面向 Windows Phone 8 的应用中,按下 Enter 键并不会产生 TextInput 事件。

在面向 Windows Phone 8 的应用中,按下 Enter 键未得到 TextBox 处理,则需要处理 KeyDown 事件来加以捕捉。

图块

在 Windows Phone 8 中,在 Closing 处理程序内部使用 Create(Uri, ShellTileData) 方法创建图块,将引发 InvalidOperationException

在应用项目的另一位置使用 Create(Uri, ShellTileData) 方法。

UIElement 文本输入事件

TextInputTextInputStartTextInputUpdate 事件不会在 Windows Phone 8 中发生,但是会在 Windows Phone OS 7.1 中发生。

您不能依赖文本输入事件检测文本控件中的更改。改用 KeyDown 事件检测文本更改。

VibrateController 控制器

在 Windows Phone OS 7.1 中,如果您在尚未调用其 Start(TimeSpan) 方法之前调用了 VibrateControllerStop() 方法,所有振动都会被取消,包括那些由其他应用(如手机或 Toast 通知)启动的振动。在 Windows Phone 8 中,如果您在尚未调用其 Start(TimeSpan) 方法之前调用了 VibrateControllerStop() 方法,则什么也不会发生。不引发异常。

尚无解决此问题所需的方法。

视频播放

在 Windows Phone 8 上,在手机由于锁定后再解锁而发生改变时恢复视频播放。在 Windows Phone OS 7.1 上,打开的视频处于已暂停状态且图像可见。在 Windows Phone 8 上,打开的视频处于已暂停状态,但显示空的黑盒替代已暂停视频的帧。在这两种情况下,用户应单击“播放”来恢复该视频。

此问题是 UI 体验中的一个更改,且没有解决方法。

WebBrowser 控件

与 Web 浏览器控件相关的 UserAgent 字符串在 Windows Phone OS 7.1 和 Windows Phone 8 之间略有更改。

不能查找 UserAgent 字符串的精确匹配,而是应该查找常规匹配。

WebBrowser 控件

WebBrowser 控件存在一些更改,能够影响应用中的内容显示。如果应用使用 WebBrowser 控件,它在 Windows Phone 8 中的显示可能与其在 Windows Phone OS 7.1 上的显示有所不同。

您应该在 Windows Phone 8 模拟器和设备上部署和测试您的应用。您应在 WebBrowser 中查找对文本、项目符号项和下拉箭头的外观更改,并确定这些更改是否会影响应用的可用性。

WebBrowser 控件

WebBrowser 控件在滚动时的行为可能有所不同。如果应用使用 WebBrowser 控件,它在 Windows Phone 8 中的滚动行为可能与其在 Windows Phone OS 7.1 上的滚动行为有所不同。

您应当在 WebBrowser 中测试滚动,并确定是否存在会影响应用可用性的差异。

WebBrowser 控件

如果 WebBrowser 控件中显示的内容使用页面缩放视区设置(例如,<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>),布局可能有所不同。在 Windows Phone OS 7.1 中,WebBrowser 控件在渲染布局时并不会说明页面缩放视区设置。在 Windows Phone 8 中,WebBrowser 控件在渲染布局时会使用页面缩放视区设置。

如果指定页面缩放视区设置,应当在不同布局下测试应用。

WebBrowser 控件

Windows Phone 8 不支持使用 Window.External 对象的 ScriptNotify 方法来调用 OnContextMenu

您可以使用 OnMSGestureHold 事件在 Windows Phone 8 中显示上下文菜单。

WebBrowser 控件

在 Windows Phone 8 中,闪烁光标并不会始终在文本区显示。

没有解决方法。文本字段将按预期工作。

XNA

由于设置 Game.IsActive 属性的时间发生了更改,游戏可能不会如预期那样恢复。

通过运行游戏、在游戏运行时锁定设备以及解锁设备以查看设备是否能够正确恢复,从而在 Windows Phone 上测试您的 Windows Phone 8 应用。若未能正确恢复,请调整您检查 Game.IsActive 属性的位置,然后暂停游戏。

XNA

在 Windows Phone 8 中,不支持下面的呈现格式。

  • SurfaceFormat.Bgra4444

  • SurfaceFormat.Bgra5551

如果您使用这些格式,它们将默认为 SurfaceFormat.Color

XNA TouchPanel

在 Windows Phone OS 7.1 应用中,TouchPanel API 返回代表实际像素的尺寸信息。在 Windows Phone 8 应用中,TouchPanel API 返回代表逻辑像素的尺寸信息。这是因为 Windows Phone 8 现在支持多种分辨率。

您应当在不同分辨率下测试应用,确保尺寸、位置与命中目标都能按预期运行。

公共语言运行时

下表列出了 Windows Phone OS 7.1 和 Windows Phone 8 平台之间公共语言运行时中的应用兼容性问题。

功能

更改

影响/解决方法

终止

Windows Phone 8 包含与 Windows Phone OS 7.1 完全不同的垃圾回收器。

依赖于特定的对象终止顺序的代码可能已损坏。应移除对特定终止顺序的依赖性。此外,用户定义的终结器中的代码不应用于调用托管数据成员。

浮点比较

由于 Windows Phone OS 7.1 和 Windows Phone 8 中舍入行为的不同,浮点值可能不同。当使用常数和浮点计算结果进行相等性比较时尤其如此。

通常不建议与浮点计算结果进行直接比较。

支持加载多模块程序集

在 Windows Phone OS 7.1 中,公共语言运行时加载多模块程序集,而在 Windows Phone 8 中则不加载。

多模块程序集是存储在多个文件中的托管程序集。此更改会造成非常少的兼容性问题,因为极少使用多模块程序集。注意,多模块程序集不是编译到单个程序集中的 .NET 模块文件。

支持添加混合模式程序集(面向 .NET Framework 桌面版本的程序集)

在 Windows Phone OS 7.1 中,具有未加载的混合模式二进制的应用可成功执行,而在 Windows Phone 8 则不会。

若要在 Windows Phone 8 中成功运行,必须从应用中移除混合模式二进制。

线程处理(.NET 线程池、.NET 线程计划策略、操作系统计划策略)

在 Windows Phone OS 7.1 中,应用在单核上运行,计划程序在单核中的时间片线程中不那么积极。在 Windows Phone 8 中,应用程序可以在多核上运行,并且计划程序在时间片线程中更积极。

相比 Windows Phone OS 7.1,争用条件和其他并发 bug 在 Windows Phone 8 更有可能发生。若要解决此问题,开发人员必须编写正确的多线程代码。

公共中间语言 (CIL) 方法大小

在 Windows Phone 8 中,方法的 CIL 的大小限制为 256 KB。

在 Windows Phone OS 7.1 中成功安装的应用安装在 Windows Phone 8 中可能会失败。这应该只会影响极少数应用。

访问私有嵌套类

Windows Phone OS 7.1 支持类访问器私有嵌套类,而 Windows Phone 8 则不支持。

不支持访问私有嵌套类。

任何非线性的封装的实例方法均不访问其方法本身中的 this 指针,而只调用静态成员。

该方法调用会在 Windows Phone 8 中引发 NullReferenceException。在 Windows Phone OS 7.1 中,可能在运行时调用静态方法,但是会在托管的调试器中引发 NullReferenceException

此行为符合 CLI 规范。应处理由对 null 引用调用方法引起的 NullReferenceException,否则不应对任何 Null 对象调用实例方法。

实例字段读取和写入

实例字段读取通过 JIT 编译器进行优化。

在独立线程上对实例字段进行写入和读取的应用程序可能会失败。此类字段应使用 C# volatile 关键字标记。

.NET Framework 类库

下表列出了 Windows Phone OS 7.1 和 Windows Phone 8 平台之间 .NET Framework 类库中的应用兼容性问题。

功能

更改

影响/解决方法

Array.GetLowerBound(Int32) 方法

如果 dimension 参数等于 Array.Rank,则 Windows Phone OS 7.1 返回 0,并且 Windows Phone 8 引发 IndexOutOfRangeException 异常。

IndexOutOfRangeException 是已记录的行为。依赖于 Windows Phone OS 7.1 行为的所有应用必须处理此异常。

Double.NaNSingle.NaN 到整数的转换

Windows Phone OS 7.1 和 Windows Phone 8 上生成的整数值不同。

根据 CLI 规范,转换的结果未指定。

Monitor.EnterMonitor.Wait

在实例字段放置监视器锁后,用户代码用新的值替换字段。根据定时,当另一线程尝试锁定或向字段发送脉冲时,此线程可能正在尚未锁定的对象上运行。

这些方法的错误使用可能导致死锁、异常或不一致的状态修改。若要解决该问题,请使用其他对象以进行同步。

Type.BaseType 属性

在 Windows Phone OS 7.1 中,属性返回泛型类型定义。在 Windows Phone 8 中,它反映泛型类型参数。

此更改应具有最小影响。

Type.GetMember 方法

为了返回构造函数,Windows Phone OS 7.1 要求字符串参数与类名称相同。Windows Phone 8 希望它为“.ctor”。

此更改应具有最小影响。

Type.GetType 方法

如果类型名称包含无效字符,Windows Phone OS 7.1 会引发 TypeLoadException 异常,而 Windows Phone 8 会引发 ArgumentException 异常。

此更改应具有最小影响。

Environment.SpecialFolder.Favorites 枚举成员

此枚举成员的值在 Windows Phone OS 7.1 中为 22,在 Windows Phone 8 中为 6。

由于用户代码无法调用需要此参数的方法,此更改应没有影响。

IsolatedStorageFile 文件名和 IsolatedStorageFile.GetFileNames 方法

在 Windows Phone OS 7.1 中,文件名可以点 (".") 结尾,并且 GetFileNames("*.") 只检索文件名以点结尾的文件。在 Windows Phone 8 中,这些操作会引发异常。

重命名文件使之不以点结尾。调用 GetFiles("*") 以检索所有文件。

IsolatedStorageFile.GetFileNames(String) 方法

在 Windows Phone OS 7.1 中,返回的数组中文件的顺序可能与在 Windows Phone 8 中有所不同。

依赖于特定顺序的应用可能会被损坏。注意,不保障文件系统的排序。

IsolatedStorageFileStream 具有使用 FileShare.None 打开的流。

由于垃圾回收中的差异,Windows Phone OS 7.1 中在释放其所有强类型引用之前不对流调用 Dispose 的代码,不会被垃圾回收并且不会被及时终止。结果是,可能未对该文件打开其他流。

应用程序应使用 using 语句以确保正确释放对象。

System.Reflection.Emit.ILGenerator.syncObj 字段

在 Windows Phone OS 7.1 中,syncObj 是受保护的内部字段。此字段在 Windows Phone 8 中未出现。

此更改应没有影响。

Mutex

在 Windows Phone OS 7.1 中,如果在存放共享的 mutex 时存在一个进程,则另一个进程可以获得该 mutex,而在 Windows Phone 8,会引发异常。

此更改应具有最小影响。若要解决此更改,第一个进程不能放弃 mutex,否则会在第二个进程尝试获取可以处理的 mutex 时引发异常。

ParameterBuilder.SetCustomAttribute(ConstructorInfo, Byte[]) 方法

此方法对 Windows Phone 8 中的用户代码不可用。

此更改应具有最小影响。在 Windows Phone OS 7.1 中,此特性仅通过 DynamicMethod 类可用,这使得此特性的使用受限。

使用 Single 进行计算的精度。

Windows Phone OS 7.1 对复杂浮点计算的中间结果使用较高的双精度。Windows Phone 8 对 ARM 系统使用较低的浮点精度。

某些情况下,具有 Single 值的浮点计算在 Windows Phone OS 7.1 和 Windows Phone 8 上可能产生不同的结果。在此情况下,在执行计算前显式强制转换为 Double

由 URI BitmapImage 请求设置的 Referer 标头值

在 Windows Phone OS 7.1 中,由 URI BitmapImage 请求设置的 Referer 标头值引用了 file:///Applications/Install/<GUID>/Install/ 格式应用的安装目录。

在 Windows Phone 8 (8.0.10322.0) 前发布的 Windows Phone 版本中,Referer 标头值引用了另一种格式的应用安装目录。同时面向 Windows Phone OS 7.1 和 Windows Phone 8 的应用会发生此问题。

已在 Windows Phone 8 (8.0.10322.0) 中解决此问题。

  • 对于面向 Windows Phone OS 7.1 的应用,Referer 标头值与 Windows Phone OS 7.1 中的值相同。

  • 对于面向 Windows Phone 8 的应用,不会发送 Referer 标头。此行为与 Windows Phone 8 上的 WebClient 类的行为一致。

依赖于 Referer 标头值的应用程序可能会崩溃。

要解决这一问题,请为 Referer 标头指定一个自定义数值。要获取一种可能的解决方案,请参见 WP7 Mango:采用自定义 Referer 标头下载图像

String.GetHashCode

Windows Phone OS 7.1 和 Windows Phone 8 对相同字符串返回不同的哈希代码。

依赖于具有特定哈希代码的特定字符串的应用程序将被损坏。

Type.GetProperties

返回的 PropertyInfo 数组中属性的顺序不同。

依赖于数组中固定的元素顺序的代码(例如序列化代码)可能会损坏应用程序。开发人员应移除对属性排序的依赖性。

WaitHandle.WaitAll 方法

此方法在 Windows Phone 8 中受支持,但在 Windows Phone OS 7.1 中会引发 NotSupportedException 异常。

在应用代码依赖于处理 NotSupportedException 异常的极少数情况下,此更改会产生影响。

XmlSerializer

关于哪些输入在 Windows Phone OS 7.1 和 Windows Phone 8 中有效,XmlSerializer 类拥有不同的规则。某些差别是突发的;请参见 .NET Framework 中的突发模式行为

要使用 XmlSerializer 并将源代码重新编译到目标 Windows Phone 8:

  1. Value 属性中删除 XmlAttributeAttribute 特性。

  2. 将 XML 中的值从特性更改为元素,如以下示例所示。

    <SerializedClass>

    <Value>42</Value>

    </SerializedClass>

XmlSerializer.Deserialize(TextReader)

如果 textReader 参数为 null,则此方法在 Windows Phone 8 中引发 ArgumentNullException 异常,并在 Windows Phone OS 7.1 中引发 InvalidOperationException

如果 null 被传递给该方法,则必须处理 ArgumentNullException 异常。

XmlSerializer.Serialize(TextWriter, Object)XmlSerializer.Serialize(TextWriter, Object, XmlSerializerNamespaces)

如果 textWriter 参数为 null,则此方法在 Windows Phone 8 中引发 ArgumentNullException 异常,并在 Windows Phone OS 7.1 中引发 NullReferenceException

如果 null 被传递给该方法,则必须处理 ArgumentNullException 异常。

以下几节列出了公共语言运行时功能的突发模式行为和 Windows Phone 的 .NET Framework 中的突发模式行为。

公共语言运行时

下表列出了公共语言运行时中的突发模式行为。

功能或区域

Windows Phone 8 行为

突发模式行为

程序集绑定:区域性

联编程序执行检查以确保应用程序集具有非特定区域性。

联编程序可以绑定到具有区域性特定的资源的程序集。

程序集绑定:版本号

未签名的程序集将版本号用于程序集绑定。

将忽略版本号。

实时 (JIT) 内联

JIT 编译器遵循一组 Windows Phone 8 特有的内联规则。

JIT 编译器遵循一组由 Windows Phone OS 7.1 使用的规则。

按类为静态数据分配内存

对每一类的静态数据总大小没有限制。

如果一个类的静态数据大小超过 64K,则运行时引发 TypeInitializationException 异常。

运行时加载程序行为:覆盖具有不同可见性的值类型的字段

如果覆盖具有不同可见性的值类型的字段,加载程序将引发 TypeLoadException 异常。

加载程序支持覆盖具有不同可见性的值类型的字段。

运行时加载程序行为:x86 特定的图像

在 ARM 系统上无法加载 x86 特定的公共中间语言 (CIL) 映像。

在 ARM 系统上可以加载 x86 特定的 CIL 映像。

运行时加载程序行为:类型定义的唯一性

不允许重复的类型定义。若要重新编译并成功执行 Windows Phone OS 7.1 代码,可以更改模糊处理器或不使用模糊处理的代码。

可以迭代由模糊处理器生成的重复类型定义。

运行时加载程序行为:静态字段上无效的自定义特性

该运行时引发 BadImageFormatException

忽略无效的特性。

具有 TypeAttributes.BeforeFieldInit 标志的静态构造函数

构造函数延迟运行。

构造函数不延迟运行。

.NET Framework 类库

下表列出了 .NET Framework 类库的类型和成员的突发模式行为。

类型或成员

Windows Phone 8 行为

Windows Phone OS 7.1 突发模式行为

将数组类型传递到 Activator.CreateInstance 方法

此方法引发 MissingMethodException 异常。

此方法返回长度为零的数组。

Array.BinarySearch<T>(T[], T), Array.Sort<T>(T[]), Array.Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>)

使用 Windows Phone 8 特有的排序算法。

使用 Windows Phone OS 7.1 特有的排序算法。

Assembly.FullName 属性

对于 null 名称,该属性返回 String.Empty

该属性返回完全限定的类型名称 ("System.Reflection.AssemblyName")。

Assembly.GetType 方法

此方法仅在调用它的程序集中搜索指定的类型。

此方法在 mscorlib.dll 和调用它的程序集中搜索指定的类型。

Assembly.GetTypeModule.GetType 方法

类型名称不能包含完全限定的程序集名称。

类型名称可以包含完全限定的程序集名称。

Load 方法

必须对程序集名称中的特殊字符进行转义,包括撇号 (')、引号 (")、逗号 (,) 和等号 (=)。否则,将无法加载程序集,并且将引发异常。

允许在程序集名称中出现未转义的特殊字符。

Load

程序集名称的限定名称不可以“+”开头。

程序集的限定名称可以用“+”开头。

AssemblyName.GetPublicKey 方法

对于没有公钥的程序集,此方法返回 null。

此方法返回 Byte[0]

比较操作,例如对 Array.Sort 方法的调用,用于实现 IComparable 及其基类实现 IComparable<T>(其中 T 是基类)的派生类

将调用基类 CompareTo(T) 实现。

将调用派生类 CompareTo(Object) 实现。

对具有 PropertyInfo 类型的 element 参数和等于 trueinherit 参数的 Attribute.GetCustomAttribute(MemberInfo, Type, Boolean)Attribute.GetCustomAttributes(MemberInfo, Boolean) 的调用

此方法搜索特性的公共父属性和非公共父属性。

此方法仅搜索特性的公共父属性。

包含 CompilationRelaxations.NoStringInterning 枚举成员的 CompilationRelaxationsAttribute 特性

该特性指定不应留用程序集中的字符串文本。

将忽略此特性。

ConstructorInfo.Invoke 方法

尝试调用开放泛型类型的构造函数会引发 MemberAccessException 异常。

该方法调用会引发 ArgumentException 异常。

Convert.FromBase64CharArray 方法

如果 inArray 参数是长度为零的字符串数组,则此方法会引发 FormatException 异常。

此方法返回空字节数组(长度为零的字节数组)。

CultureInfo.CultureInfo(String) 方法

如果区域性名称无效,则构造函数引发 ArgumentException 异常。

对构造函数的调用会引发 PlatformNotSupportedException 异常。

CultureInfo.CultureInfo(String) 方法

iw 和 tl 是无效的区域性名称。

iw 和 tl 是有效的区域性名称,分别等效于 he (Hebrew) 和 fil (Filipino) 区域性。

CultureInfo.CultureInfo(String) 方法

支持 bn(孟加拉语)、bn-BD(孟加拉语(孟加拉国))和 bn-IN(孟加拉语(印度))区域性。

构造函数会引发异常,因为不支持区域性 bn、bn-BD 和 bn-IN。

CultureInfo.InvariantCulture.DisplayName 属性

此属性返回“固定语言(固定国家/地区)”。

此属性返回“固定语言”。

自定义特性数据检索,例如对 Attribute.IsDefinedGetCustomAttributes 方法的调用

如果无法加载特性类型,此方法将引发异常。

将忽略此方法调用。

DataContractSerializer

XML 元素必须按字母顺序排序。

可以不对 XML 元素排序。

DateTime.Now.TimeOfDay.TotalMillisecond 属性

值精确到 100 毫微秒。

值精确到 1 毫秒。

DebuggableAttribute 特性

此特性指示运行时在模块内提供代码的特殊处理以便提供调试信息。

将忽略此特性。

Delegate.CreateDelegate 方法

尝试使用不正确的参数创建委托会引发 MissingMethodException 异常。

此方法返回 null。

Delegate.CreateDelegate 方法

尝试以非泛型类型对泛型方法创建代理,会引发 ArgumentException 异常。

此方法引发 MissingMethodException 异常。

Enum.IsDefined 方法

如果 value 参数不是整数类型或字符串,则此方法引发 InvalidOperationException 异常。

此方法引发 ArgumentException 异常。

异常筛选器

支持在筛选器末尾使用单个末尾筛选器 (OpCodes.Endfilter) 说明,否则引发 InvalidProgramException 异常。

允许在筛选器末尾使用多个末尾筛选器说明。这些说明通常由模糊处理器发出。

FieldInfo.GetValueFieldInfo.SetValue 方法

尝试获取或设置由 null 值表示的对象的实例字段值会引发 TargetException 异常。

该方法调用会引发 ArgumentNullException 异常。

FieldInfo.ToString 方法

对于 Boolean 字段,返回值为“Boolean”,对于 Int32 字段,返回值为“Int32”。

对于 Boolean 字段,返回值为“System.Boolean”;对于 Int32 字段,返回值为“System.Int32”。

FileLoadException.Data 属性

返回的 IDictionary 对象不包括 HRESULT。

返回的 IDictionary 对象包括名为 HResult 的 HRESULT。

IsolatedStorageFile.FileExists(String) 方法

如果传递了 null,则此方法将引发 ArgumentNullException 异常。

此方法返回 false

IsolatedStorageFile.GetFileNames(String)IsolatedStorageFile.GetDirectoryNames(String) 方法

searchPattern 参数由包含通配符的文本字符串组成,并且此方法执行标准文件压缩。

这些方法将文件与 searchPattern 进行比较,这与在 Windows Phone 之前的版本中所做的一样。

IsolatedStorageFileIsolatedStorageFileStream

尝试在不存在的路径或丢失了一个或多个子目录的路径上执行操作会引发 IsolatedStorageException 异常。

尝试在此类路径上执行操作会引发 DirectoryNotFoundException 异常。

MethodInfo.Invoke 方法

如果调用的方法没有参数默认值,则引发 ArgumentException 异常。

不引发异常。

Mutex

Mutex 名称不能包含反斜杠字符。

允许在 Mutex 名称中使用反斜杠字符,并且将在运行时用其他字符替换。

NeutralResourcesLanguageAttribute 特性

定义为应用程序提供默认资源的区域性。

将忽略此特性。固定区域性为应用程序提供默认资源。

NeutralResourcesLanguageAttribute 方法

location 参数确定应用的默认回调资源的位置。

忽略 location 参数。

NotifyCollectionChangedEventArgs

正确更新起始索引。

未正确更新起始索引,并且某些控件依赖于此行为。

NotifyCollectionChangedEventArgs.NewItems

属性值为只读 ArrayList 对象。

属性值是一个 Object 数组。

ObjectDisposedException.ObjectName 属性

如果传递到 ObjectDisposedException() 构造函数的一个重载的对象名称为 null,则此属性返回 Empty

此属性返回 null。

ParameterInfo.DefaultValue 属性

如果该参数不具有默认值,则此属性返回 Value

此属性返回 null。

GetDirectoryName(String) 方法

此方法通过移除冗余的“.”、“ ”和“\”字符将路径规范化。

路径未规范化,此方法仅将返回的字符串与最大路径长度进行对比。

WebClient 设置的 Referer 标头值

默认情况下,不会发送 Referer 标头。可以为 Referer 标头指定一个自定义值。

此行为与 Windows Phone 8 (8.0.10322.0) 或更高版本上的 BitmapImage 类的行为一致。

Referer 标头值引用了采用 file:///Applications/Install/<GUID>/Install/ 格式的应用安装目录。

资源回调

默认的回调区域性是操作系统首选的回调区域性。

此默认区域性由 NeutralResourcesLanguageAttribute 特性定义。

GetNeutralResourcesLanguage(Assembly) 方法

此方法按照 NeutralResourcesLanguageAttribute 特性的定义返回程序集的默认区域性;否则返回 InvariantCulture

此方法始终返回 InvariantCulture

RuntimeHelpers.InitializeArray 方法

模糊处理的手机应用的确认失败。

模糊处理的手机应用的确认成功。

RunWorkerCompletedEventArgs.Result 属性

如果在异步操作期间发生错误,此属性引发 TargetInvocationException 异常,并且 TargetInvocationExceptionInnerException 属性包含有关此异常的信息。

异常为直接引发,并且未包装在 TargetInvocationException 异常中。

BeginReadBeginWriteEndReadEndWrite 和子类方法

异步执行输入/输出操作。

同步执行输入/输出操作。

System.IO.StreamReader

未显式指定缓冲区大小的情况下实例化的对象的默认缓冲区大小为 1,024 字节。

默认缓冲区大小为 4,096 个字节。

StreamWriter.CloseStreamWriter.Dispose 方法

如果通过使用流来实例化 StreamWriter 对象,则关闭 StreamWriter 实例将刷新并释放基础流。

如果基础流由多个 StreamWriter 对象共享,则不会执行刷新和释放操作。

String.Replace(String, String)

嵌入式 null (U+0000) 将被视为与任何其他字符类似。

Windows Phone OS 7.1 的早期版本是突发的,嵌入式 null 后面的所有字符均被丢弃。此突发沿用到 Windows Phone 8 中。

String.Trim

字节顺序标记不会被裁剪操作移除。

字节顺序标记被裁剪操作视为空白并被移除。

StringBuilder.Append(Char[], Int32, Int32)StringBuilder.Append(String, Int32, Int32) 方法

如果 count 参数为零,则此方法引发 ArgumentOutOfRangeException 异常。

此方法返回未更改的 StringBuilder 实例的值。

SynchronizationContext.Current 属性

此属性返回基于每个线程的 SynchronizationContext 对象。

此属性对所有线程返回相同的 SynchronizationContext 对象。

Thread.CurrentCultureThread.CurrentUICulture 属性

对当前区域性和当前 UI 区域性的更改仅影响当前线程。

对当前区域性和当前 UI 区域性的更改会影响所有应用线程。

TimeSpan.ToString(String)TimeSpan.ToString(String, IFormatProvider) 方法

formatprovider 参数生成区分区域性的结果字符串。

忽略 formatprovider 参数。

Type.GetMethod, Type.GetMethods, PropertyInfo.GetGetMethod, PropertyInfo.GetSetMethod

此方法不返回继承的私有方法。

此方法返回继承的私有方法。

具有 Type 数组参数的 Type.GetProperty 方法的重载。

如果数组中的任何元素为 null,则此方法引发 ArgumentNullException 异常。

此方法引发 NullReferenceException 异常。

Type.GetPropertyType.GetProperties 方法

如果当前实例为在基类(隐藏在当前类型中)中具有属性的泛型类型,则此方法引发 AmbiguousMatchException 异常。

此方法检索此属性。

Type.GetPropertyType.GetProperties 方法,具有 BindingFlags 类型的参数。

此方法不返回基类中的重写属性。

此方法可以返回基类中的重写成员。

Type.GetType 方法

如果向其传递了空字符串,则此方法引发 ArgumentException 异常。

此方法引发 TypeLoadException 异常。

将引用类型传递到 Type.MakeByRefType 方法

此方法返回 null。

此方法引发 TypeLoadException 异常。

Uri.Uri 方法

尝试实例化基于相对 URI(可引用嵌入程序集中的文件或资源)的 Uri 对象,会引发 UriFormatException 异常。

支持引用嵌入程序集中的文件或资源的相对 URI。

Version.CompareTo(Object) 方法

如果 version 参数为 String,则此方法引发 ArgumentException 异常。

此方法引发 InvalidCastException 异常。

Version.CompareTo(Object) 方法

如果 version 参数为 null,则该方法返回 1。

此方法引发 ArgumentOutOfRangeException 异常。

WaitHandle.WaitAll

等待指定的对象。对 WaitAll 的调用可能会阻止。

此方法返回 true,不进行等待。

X509Certificate.X509Certificate(Byte[], String)X509Certificate.X509Certificate(Byte[], String, X509KeyStorageFlags) 方法

如果字节数组为 null 或具有零个元素,则此构造函数引发 ArgumentException 异常。

不引发异常。

X509Certificate.X509CertificateX509Certificate.Import 方法,具有 X509KeyStorageFlags 参数

如果标志无效,则对象创建构造函数或方法会引发 ArgumentException 异常。

此构造函数或方法引发 NotSupportedException 异常。

XmlElementAttribute.ElementName 属性

如果名称并不唯一,则 XML 序列化程序引发 InvalidOperationException 异常。

允许出现重复元素名称。

XmlSerializer

序列化类型必须具有默认(无参数)的构造函数。

序列化类型不一定具有默认的构造函数。

XmlSerializer

默认情况下,XML 序列化假定 XML 为 UTF-8 编码并且发出 encoding=utf-8 特性。

序列化程序不发出编码特性。

XmlSerializer

如果派生类型定义与其基类型具有相同名称的成员,则序列化程序引发异常。

序列化程序允许派生类型定义与其基类型具有相同名称的成员。

XmlSerializer

具有 Nullable<T> 类型的属性的类型不可序列化。

具有类型属性的类型可以序列化。

XmlSerializer

尝试反序列化空 XML 文件会引发异常。

不引发异常。

XmlSerializer

序列化程序需要元素数据用 XmlRootAttribute 特性标记。

如果没有 XmlRootAttribute 特性,XmlArrayItemAttribute 可以应用到元素数据。

XmlSerializer.Deserialize 和其他 XML 读取操作

读取操作返回字节流末尾的所有尾随 null。

读取操作舍弃字节流末尾的所有尾随 null。

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft. 版权所有。