.NET Framework 4 迁移问题

本文介绍 .NET Framework 版本 3.5 Service Pack 1 和 .NET Framework 版本 4 之间的迁移问题,包括修补程序、标准符合性和安全性的更改以及基于客户反馈的更改。 其中大多数更改不需要应用程序中的任何编程修改。 有关可能涉及修改的内容,请参阅表 的“建议更改 ”列。 显著更改按区域细分,例如 ASP.NET 和 Windows Presentation Foundation(WPF)。

有关本文中问题的更高级别概述,请参阅 .NET Framework 4 的迁移指南

有关新功能的信息,请参阅 .NET Framework 4 中的新增功能。

ASP.NET 和 Web

命名空间:System.WebSystem.Web.MobileSystem.Web.SecuritySystem.Web.UI.WebControls

程序集:System.Web(在 System.Web.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
浏览器定义文件 浏览器定义文件已更新,以包含有关新浏览器和设备的信息。 已删除 Netscape Navigator 等较旧的浏览器和设备,并添加了较新的浏览器和设备,例如 Google Chrome 和 Apple iPhone。

如果应用程序包含从已删除的浏览器定义之一继承的自定义浏览器定义,则会看到错误。

对象 HttpBrowserCapabilities (由页面 Request.Browse 的属性公开)由浏览器定义文件驱动。 因此,通过访问 ASP.NET 4 中此对象的属性返回的信息可能与在早期版本的 ASP.NET 中返回的信息不同。
如果应用程序依赖于旧的浏览器定义文件,则可以从以下文件夹中复制这些文件:

Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers

将文件复制到 ASP.NET 4 的相应 \CONFIG\Browsers 文件夹中。 复制文件后,运行 Aspnet_regbrowsers.exe 命令行工具。 有关详细信息,请参阅 https://www.asp.net/mobile 网站。
在混合版本的 ASP.NET 下运行的子应用程序 由于配置或编译错误,作为运行早期版本 ASP.NET 的应用程序子级配置的 ASP.NET 4 应用程序可能无法启动。 发生的特定错误取决于应用程序是在 IIS 6.0 下还是在 IIS 7 或 IIS 7.5 下运行。 可以对受影响应用程序的配置文件进行更改,使配置系统能够正确识别 ASP.NET 4 应用程序。 有关您必须进行的更改的信息,请参阅 ASP.NET 网站上的文档《ASP.NET 4 破坏性更改》中的“ASP.NET 4 子应用程序在 ASP.NET 2.0 或 ASP.NET 3.5 应用程序下无法启动”一节。
ClientID 更改 通过 ASP.NET 4 中的新 clientIDMode 设置,可以指定 ASP.NET 如何为 HTML 元素生成 id 属性。 在早期版本的 ASP.NET 中,默认行为等效于 AutoIDclientIDMode 设置。 默认设置现在为Predictable。 有关详细信息,请参阅 ASP.NET Web 服务器控制标识 如果使用 Visual Studio 从 ASP.NET 2.0 或 ASP.NET 3.5 升级应用程序,该工具会自动将设置添加到 Web.config 文件,该文件保留早期版本的 .NET Framework 的行为。 但是,如果通过将 IIS 中的应用程序池更改为面向 .NET Framework 4 来升级应用程序,ASP.NET 默认使用新模式。 若要禁用新的客户端 ID 模式,请将以下设置添加到 Web.config 文件:

<pages clientIDMode="AutoID" />
代码访问安全性 (CAS) ASP.NET ASP.NET 3.5 中添加的 2.0 NET 功能使用 .NET Framework 1.1 和 .NET Framework 2.0 代码访问安全性 (CAS) 模型。 然而,ASP.NET 4 中的 CAS 实施已经进行了实质性的改进。 因此,依赖于在全局程序集缓存中运行的受信任代码的部分信任 ASP.NET 应用程序可能失败,并引发各种安全异常。 此外,依赖于对计算机 CAS 策略进行的大量修改的部分信任应用程序也可能失败,并引发安全异常。 可以使用配置元素中的legacyCasModel新属性,将部分信任的 ASP.NET 4 应用程序还原为 ASP.NET 1.1 和 2.0 的行为,如以下示例所示:

<trust level= "Medium" legacyCasModel="true" />

重要说明:还原到较旧的 CAS 模型可能表示安全性降低。

有关新的 ASP.NET 4 代码访问安全模型的详细信息,请参阅 ASP.NET 4 应用程序中的代码访问安全性
配置文件 .NET Framework 和 ASP.NET 4 的根配置文件(machine.config 文件和根 Web.config 文件)已更新,现包含在 ASP.NET 3.5 的应用程序 Web.config 文件中找到的大多数基本配置信息。 由于托管 IIS 7 和 IIS 7.5 配置系统的复杂性,在 ASP.NET 4 和 IIS 7 和 IIS 7.5 下运行 ASP.NET 3.5 应用程序可能会导致 ASP.NET 错误或 IIS 错误。 使用 Visual Studio 中的项目升级工具 ASP.NET 将 3.5 应用程序升级到 ASP.NET 4。 Visual Studio 2010 自动修改 ASP.NET 3.5 应用程序的 Web.config 文件,以包含 ASP.NET 4 的适当设置。

但是,可以使用 .NET Framework 4 运行 ASP.NET 3.5 应用程序,而无需重新编译。 在这种情况下,在 .NET Framework 4 和 IIS 7 或 IIS 7.5 下运行应用程序之前,可能需要手动修改应用程序的 Web.config 文件。 必须进行的特定更改取决于你正在使用的软件的组合,包括 Service Pack (SP) 版本。 有关受此更改影响的可能软件组合及如何解决特定组合问题的信息,请参阅 ASP.NET 网站上的文档《ASP.NET 4 重大更改》中的“与新 ASP.NET 4 根配置相关的配置错误”一节。
控制呈现 在以前版本的 ASP.NET 中,某些控件发出了无法禁用的标记。 默认情况下,此类型的标记在 ASP.NET 4 中不再生成。 呈现更改会影响以下控件:

* 控件ImageImageButton不再呈现border="0"属性。
BaseValidator* 默认情况下,派生自它的类和验证控件不再呈现红色文本。
* 控件 HtmlForm 不呈现 name 属性。
* 控件 Table 不再呈现 border="0" 属性。

未为用户输入设计的控件(例如Label,控件)如果属性disabled="disabled"设置为Enabled(或者从容器控件继承此设置),则不再呈现false该属性。
如果使用 Visual Studio 从 ASP.NET 2.0 或 ASP.NET 3.5 升级应用程序,该工具会自动将设置添加到保留旧呈现的 Web.config 文件中。 但是,如果通过将 IIS 中的应用程序池更改为面向 .NET Framework 4 来升级应用程序,ASP.NET 默认使用新的呈现模式。 若要禁用新的呈现模式,请将以下设置添加到 Web.config 文件:

<pages controlRenderingCompatibilityVersion="3.5" />
默认文档中的事件处理程序 在对无扩展的 URL 发出请求(此 URL 具有已映射到它的默认文档)时,ASP.NET 4 会将 HTML form 元素的 action 属性呈现为空字符串。 在 ASP.NET 的早期版本中,对 http://contoso.com 的请求会导致对 Default.aspx 的请求。 在该文档中,开始标记 form 将呈现如以下示例所示:

<form action="Default.aspx" />

在 ASP.NET 4 中,请求 http://contoso.com 也会导致请求Default.aspx,但 ASP.NET 现在呈现 HTML 开始 form 标记,如以下示例所示:

<form action="" />

action当属性为空字符串时,IIS DefaultDocumentModule 对象将创建一个子请求来Default.aspx。 在大多数情况下,此子请求对应用程序代码是透明的,Default.aspx页面运行正常。 但是,托管代码与 IIS 7 或 IIS 7.5 集成模式之间的潜在交互可能会导致托管.aspx页面在子请求期间停止正常工作。 如果出现以下情况,对默认.aspx文档的子请求将导致错误或意外行为:

* 将.aspx页发送到浏览器,该 form 元素 action 的属性设置为“”。
表单数据回传给 ASP.NET。
* 托管 HTTP 模块读取实体正文的某些部分,例如 Request.FormRequest.Params。 这会导致 POST 请求的实体正文读取到托管内存中。 因此,实体正文不再可用于在 IIS 7 或 IIS 7.5 集成模式下运行的任何本机代码模块。
* IIS DefaultDocumentModule 对象最终运行并创建对Default.aspx文档的子请求。 但是,由于实体正文已由一段托管代码读取,因此没有可用于发送到子请求的实体正文。
* 在对子请求运行 HTTP 管道时,将在处理程序执行阶段运行 .aspx 文件的处理程序。

由于没有实体正文,因此没有窗体变量,也没有视图状态。 这样一来,便没有可供 .aspx 页处理程序用来确定应引发哪个事件(如果有)的信息。 因此,不会运行针对受影响 .aspx 页的任何回发事件处理程序。
有关解决可能因为此更改而引发的问题的方法,请参阅 ASP.NET 网站上的 ASP.NET 4 Breaking Changes(ASP.NET 4 重大更改)文档中“可能会在 IIS 7 或 IIS 7.5 集成模式下的默认文档中引发的事件处理程序”。
哈希算法 ASP.NET 同时使用加密和哈希算法来帮助保护表单身份验证 Cookie 和视图状态等数据。 默认情况下,ASP.NET 4 使用 HMACSHA256 算法对 Cookie 和视图状态执行哈希作。 早期版本的 ASP.NET 使用了较旧的 HMACSHA1 算法。 如果运行混合 ASP.NET 2.0 和 ASP.NET 4 的应用程序,其中表单身份验证 Cookie 等数据必须跨 .NET Framework 版本工作,请将 ASP.NET 4 Web 应用程序配置为在 Web.config 文件中添加以下设置来使用旧 HMACSHA1 算法:

<machineKey validation="SHA1" />
Internet Explorer 中的托管控件 不能再在 Internet Explorer 中托管 Windows 窗体控件,因为 Web 上托管控件有更好的解决方案。 因此,已从 .NET Framework 中删除 IEHost.dll 和 IEExec.exe 程序集。 可以使用以下技术在 Web 应用程序中进行自定义控件开发:

* 可以创建 Silverlight 应用程序并将其配置为在浏览器外部运行。 有关详细信息,请参阅 “浏览器外支持”。
* 可以生成 XAML 浏览器应用程序(XBAP),以利用 WPF 功能(需要客户端计算机上的 .NET Framework)。 有关详细信息,请参阅 WPF XAML 浏览器应用程序概述
HtmlEncode 和 UrlEncode 方法 HtmlEncode类和UrlEncode类的HttpUtility方法和HttpServerUtility方法已经更新,以对单引号字符(')进行编码,如下所示:

* 该方法将 HtmlEncode 单引号的实例编码为 &#39;
* 该方法将 UrlEncode 单引号的实例编码为 %27
检查代码中的用法 HtmlEncodeUrlEncode 方法的位置,并确保编码更改不会导致影响应用程序的更改。
ASP.NET 2.0 应用程序中的 HttpException 错误 在 IIS 6 上启用 ASP.NET 4 后,ASP.NET 在 IIS 6 上运行的 2.0 应用程序(在 Windows Server 2003 或 Windows Server 2003 R2 中)可能会生成如下错误: System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found. * 如果 ASP.NET 4 不是运行网站所必需的,请重新映射网站以改用 ASP.NET 2.0。

-或-

如果网站需要 ASP.NET 4 才能运行,请将任何子 ASP.NET 2.0 虚拟目录移动到映射为 ASP.NET 2.0 的其他网站。

-或-

* 禁用无扩展 URL。 有关详细信息,请参阅 ASP.NET 网站上 ASP.NET 4 项重大更改 的文档中的“ASP.NET 2.0 应用程序可能会生成引用 eurl.axd 的 HttpException 错误”。
成员身份类型 已将 ASP.NET 成员资格中使用的某些类型(例如 MembershipProvider)从 System.Web.dll 移至 System.Web.ApplicationServices.dll 程序集。 这些类型已移动,以便解析客户端和扩展的 .NET Framework SKU 中的类型之间的体系结构分层依赖关系。 已从早期版本的 ASP.NET 升级且使用已移动的成员身份类型的类库在 ASP.NET 4 项目中使用时可能无法编译。 如果是,请在类库项目中添加指向 System.Web.ApplicationServices.dll的引用。
菜单控件更改 Menu 控件的更改会导致以下行为:

* 如果 MenuRenderingMode 设置为 ListMenuRenderingMode 设置为 DefaultControlRenderingCompatibilityVersion 设置为 4.0 或更高版本,则 PopOutImageUrl 属性无效。
* 如果在属性中StaticPopOutImageUrlDynamicPopOutImageUrl设置的路径包含反斜杠(\),则图像不会呈现。 (在 ASP.NET 的早期版本中,路径可包含反斜杠。)
* 不要为单个菜单项设置 PopOutImageUrl 属性,而是为父 StaticPopOutImageUrl 控件设置 DynamicPopOutImageUrlMenu

-或-

MenuRenderingMode设置为Table,或者将MenuRenderingMode设置为Default并且将ControlRenderingCompatibilityVersion设置为3.5。 这些设置会导致 Menu 控件使用在早期版本的 ASP.NET 中使用的基于 HTML 表的布局。
* 如果StaticPopOutImageUrlDynamicPopOutImageUrl属性中的路径包含反斜杠(\),请将其替换为斜杠字符(/)。
Web.config 文件中的移动程序集 在早期版本的 ASP.NET 中,对 System.Web.Mobile.dll 程序集的引用包含在 assembliessystem.web/ 的 compilation 节中的根 Web.config 文件中。 为了提高性能,已删除对此程序集的引用。

注意:System.Web.Mobile.dll 程序集和 ASP.NET 移动控件包含在 ASP.NET 4 中,但已弃用。
如果要使用此程序集中的类型,请在根 Web.config 文件或应用程序 Web.config 文件中添加对程序集的引用。
输出缓存 在 ASP.NET 1.0 中,一个错误导致指定 Location="ServerAndClient" 作为输出缓存设置的缓存页在响应中发出了 Vary:* HTTP 标头。 这具有告知客户端浏览器从不在本地缓存页面的效果。 在 ASP.NET 1.1 中, SetOmitVaryStar 添加了该方法,该方法可以调用以抑制 Vary:* 标头。 但是,bug 报告表明开发人员不知道现有 SetOmitVaryStar 行为。

在 ASP.NET 4 中,不再从指定以下指令的响应中发出 Vary:* HTTP 标头:

<%@ OutputCache Location="ServerAndClient" %>

因此,不再需要使用 SetOmitVaryStar 方法来取消 Vary:* 标头。 在为 Location 属性指定“ServerAndClient”的应用程序中,页面将在浏览器中缓存,而无需调用 SetOmitVaryStar
如果应用程序中的页面必须发出 Vary:*,请调用 AppendHeader 方法,如以下示例所示:

System.Web.HttpResponse.AppendHeader("Vary","*");

或者,可以将输出缓存 Location 属性的值更改为“Server”。
页面分析 在 ASP.NET 4 中,ASP.NET 网页(.aspx 文件)和用户控件(.ascx 文件)的页面解析器比早期版本更严格,并且比起早期版本,会标记更多的标记为无效。 检查在页面运行时生成的错误消息,并修复由无效标记导致的错误。
护照类型 ASP.NET 2.0 中内置的 Passport 支持已过时,由于 Passport(现在实时 ID SDK)发生了更改,因此不受支持。 因此,与 Passport 相关的 System.Web.Security 类型现在标有属性 ObsoleteAttribute 更改使用 System.Web.Security 命名空间中 Passport 类型(例如 PassportIdentity)的代码,以使用 Windows Live ID SDK。
FilePath 属性中的 PathInfo 信息 ASP.NET 4 的返回值中不再包括来自 PathInfoFilePathAppRelativeCurrentExecutionFilePath 属性的 CurrentExecutionFilePath 值。 而是在 PathInfo 中提供 PathInfo 信息。 例如,假设以下 URL 片段:

/testapp/Action.mvc/SomeAction

在早期版本的 ASP.NET 中, HttpRequest 属性具有以下值:

%>
* PathInfo:(空)

在 ASP.NET 4 中, HttpRequest 属性改为具有以下值:

%>
%>
检查代码中依赖 HttpRequest 类属性返回路径信息的地方,并更改代码以适应路径信息返回方式的改变。
请求验证 为了改进请求验证,请求生命周期的前面会调用 ASP.NET 请求验证。 因此,请求验证针对不用于.aspx文件(例如 Web 服务调用和自定义处理程序)的请求运行。 当自定义 HTTP 模块在请求处理管道中运行时,请求验证也将处于活动状态。

由于此更改,除.aspx文件以外的资源请求可能会引发请求验证错误。 在请求管道中运行的自定义代码(例如自定义 HTTP 模块)也可能引发请求验证错误。
如有必要,可通过使用 Web 配置文件中的以下设置,还原为仅让 .aspx 页触发请求验证这一旧行为:

<httpRuntime requestValidationMode="2.0" />

警告:如果还原到旧行为,请确保现有处理程序、模块和其他自定义代码中的所有代码执行检查可能不安全的 HTTP 输入(可能是 XSS 攻击途径)。
路由 如果在 Visual Studio 2010 中创建文件系统网站,并且网站位于文件夹名称中包含点(.)的文件夹中,则 URL 路由将无法可靠地工作。 从某些虚拟路径返回 HTTP 404 错误。 之所以发生这种情况,是因为 Visual Studio 2010 使用根虚拟目录的错误路径启动 Visual Studio 开发服务器。 * 在基于文件的网站的 “属性 ”页中,将 虚拟路径 属性更改为“/”。

-或-

* 创建 Web 应用程序项目而不是网站项目。 Web 应用程序项目没有此问题,即使项目文件夹的名称中有一个点,URL 路由也适用。

-或-

* 创建在 IIS 中托管的基于 HTTP 的网站。 IIS 托管的网站可在虚拟路径和项目文件文件夹中包含点。
SharePoint 站点 如果尝试运行一个部署为 SharePoint 网站子级的 ASP.NET 4 网站,并且该网站包含名为 WSS_Minimal 的自定义部分信任级别,您将看到以下错误:

Could not find permission set named 'ASP.Net'.
目前,SharePoint 版本与 ASP.NET 不兼容。 因此,不应尝试将 ASP.NET 4 网站作为 SharePoint 网站的子网站运行。
XHTML 1.1 标准 若要为新网站启用 XHTML 1.1 符合性,.NET Framework 4 中的 ASP.NET 控件将生成符合 XHTML 1.1 的 HTML。 使用 <system.Web> 元素内 Web.config 文件中的以下选项可启用此呈现:

<pages controlRenderingCompatibilityVersion="4.0"/>

此选项默认设置为 4.0。 从 Visual Studio 2008 升级的 Web 项目已启用 3.5 设置以实现兼容性。
没有。

核心

常规功能

功能 / 特点 与 3.5 SP1 的差异 建议的更改
CardSpace .NET Framework 中不再包含 Windows CardSpace;它单独提供。 Microsoft下载中心下载 Windows CardSpace。
配置文件 对 .NET Framework 如何访问应用程序配置文件进行了更正。 如果应用程序配置文件命名 为application-name.config,请将其重命名为 application-name.exe.config。例如,将 MyApp.config 重命名为 MyApp.exe.config
C# 代码编译器 CompilerCompilerErrorErrorLevel类原本位于Microsoft.CSharp命名空间,但现在不再可用,并且它们的程序集(cscompmgd.dll)也不再包含在 .NET Framework 中。 使用 CodeDomProvider 命名空间中的 System.CodeDom.Compiler 类和其他类。 有关详细信息,请参阅 使用 CodeDOM
承载(非托管 API) 为了改进托管功能,已弃用某些托管激活 API。 进程内并行执行功能使应用程序能够在同一进程中加载和启动多个版本的 .NET Framework。 例如,可以运行加载基于 .NET Framework 2.0 SP1 的外接程序(或组件)的应用程序,以及在同一进程中基于 .NET Framework 4 的外接程序。 旧组件继续使用较旧的 .NET Framework 版本,新组件使用新的 .NET Framework 版本。 使用 In-Process 并行执行中所述的配置。
新的安全模型 代码访问安全 (CAS) 策略已关闭并替换为简化的模型,如 .NET Framework 4 中的安全更改中所述。 如果您在应用程序中对 CAS 依赖,可能需要进行修改。 有关详细信息,请参阅 代码访问安全策略兼容性和迁移

日期和时间

Namespace: System

程序集:mscorlib(在 mscorlib.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
夏令时 为了与系统时钟保持一致,时间属性(如 LocalNow)现在使用操作系统规则而不是其他 .NET Framework 数据进行夏令时操作。 没有。
设置字符串格式 为了支持区分区域性的格式设置,TimeSpan 结构包含了 ToStringParseTryParse 方法的新重载,以及新的 ParseExactTryParseExact 方法。 没有。

全球化

有关新的中性文化和特定文化的列表,请参阅 全球化和本地化中的新增功能

Namespace: System.Globalization

程序集:mscorlib(在 mscorlib.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
文化名称 以下名称更改会影响德语、迪维希和非洲文化:

* CurrencyEnglishName:德国(瑞士)(de-CH)文化的货币名称已从“sFr”更改为“Fr.”。
* LongDatePattern:迪维希语(马尔代夫)(dv-MV)文化的长日期模式已从“dd/MMMM/yyyy”更改为“dd/MM/yyyy”。
* PMDesignator:南非荷兰语(南非)(af-ZA) 区域性的 P.M. 指示符已从“nm”更改为“PM”。
注意区域性名称更改。
LCID 参数 为了与自动化服务器设置中的预期行为保持一致,CLR 不再传递 LCID 参数的当前文化信息给非托管 COM 应用程序。 而是为区域性传递 1033 (en-us)。 除了那些需要指定文化的本地应用程序之外,无需进行任何修改。
过时的文化类型 CultureTypesCultureTypes 文化类型现在已过时。

为了向后兼容,CultureTypes 现在返回在之前的 .NET Framework 中包含的中性文化和特定文化,而 CultureTypes 则返回一个空列表。
使用 CultureTypes 枚举的其他值。
检索区域性 自 Windows 7 开始,.NET Framework 4 从操作系统检索区域性信息,而不是存储数据本身。 此外,.NET Framework 与 Windows 同步,以便对数据进行排序并设置其大小写。 没有。
Unicode 5.1 标准 .NET Framework 现在支持所有 Unicode 5.1 个字符 -- 添加大约 1400 个字符。 其他字符包括新符号、箭头、音调符号、标点符号、数学符号、CJK 笔划和象形字、其他马拉雅拉姆语和泰卢古数字字符,以及各种缅甸、拉丁语、阿拉伯语、希腊文、蒙古语和西里尔文字符。 Unicode 5.1 支持以下新文种:巽他语、列普查语、欧甘语、瓦依语、索拉什拉特语、克耶黎语、勒姜语、果鲁穆奇语、奥里雅语、泰米尔语、泰卢固语、马拉雅拉姆语字符和占语。 没有。

例外

命名空间: SystemSystem.Runtime.ExceptionServices

程序集:mscorlib(在 mscorlib.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
损坏进程状态的异常 CLR 不再将损坏的进程状态的异常传递到托管代码中的异常处理程序。 这些异常表示进程的状态已损坏。 不建议在此状态下运行应用程序。

有关详细信息,请参阅 HandleProcessCorruptedStateExceptionsAttribute 和 MSDN 杂志中的条目处理损坏状态异常
执行引擎异常 ExecutionEngineException 现已过时,因为可捕获的异常将允许不稳定的进程继续运行。 此更改可提高运行时的可预测性和可靠性。 使用InvalidOperationException来指示条件。

反射

Namespace: System.Reflection

程序集:mscorlib(在 mscorlib.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
程序集哈希算法 HashAlgorithm 属性现在返回 AssemblyHashAlgorithm,因为运行时在未加载程序集时不知道所引用程序集的哈希算法。 (这表示使用所引用的程序集(如由 GetReferencedAssemblies 方法返回的程序集)的属性。) 没有。
程序集加载 为了防止程序集的冗余加载并节省虚拟地址空间,CLR 现在仅使用 Win32 MapViewOfFile 函数加载程序集。 它不再调用函数 LoadLibrary

此更改通过以下方式影响诊断应用程序:

* ProcessModuleCollection 将不再包含通过调用 Process.GetCurrentProcess().Modules 获取的类库(.dll 文件)中的任何模块。
* 使用 EnumProcessModules 函数的 Win32 应用程序不会看到列出的所有托管模块。
没有。
声明类型 当类型没有声明类型时,DeclaringType 属性现将正确返回 null。 没有。
代表 在将 null 值传递给委托的构造函数时,委托现将引发 ArgumentNullException 而不是 NullReferenceException 确保任何异常处理捕获 ArgumentNullException
全局程序集缓存位置更改 对于 .NET Framework 4 程序集,全局程序集缓存已从 Windows 目录(%WINDIR%)移动到 Microsoft.Net 子目录(%WINDIR%\Microsoft.Net)。 早期版本中的程序集仍保留在旧目录中。

非托管 ASM_CACHE_FLAGS 枚举包含新的 ASM_CACHE_ROOT_EX 标志。 此标志获取 .NET Framework 4 程序集的缓存位置,这些程序集可由 GetCachePath 函数获取。
无,假设应用程序不使用程序集的显式路径,这不是建议的做法。
全局程序集缓存工具 Gacutil.exe(全局程序集缓存工具)不再支持 shell 插件查看器。 没有。

互操作性

Namespace: System.Runtime.InteropServices

程序集:mscorlib(在 mscorlib.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
缓冲区长度 (非托管 API) 为了节省内存,pBufferLengthOffset 方法对参数 的功能进行了更改,以匹配参数 pStringLengthOffset。 这两个参数现在都指向字符串长度的偏移位置。 缓冲区长度已从字符串类的表示形式中删除。 删除缓冲区长度的任何依赖项。
JIT 调试 为了简化实时(JIT)调试的注册,.NET Framework 调试器现在仅使用 AeDebug 注册表项,用于控制本机代码的 JIT 调试行为。 此更改会导致以下结果:

* 不能再为托管代码和本机代码注册两个不同的调试器。
* 不能再自动为非交互式进程启动调试器,但可以提示用户执行交互式进程。
* 当调试器无法启动或没有应启动的已注册调试器时,将不再收到通知。
* 不再支持依赖于应用程序的交互性的自动启动策略。
根据需要调整调试操作。
平台调用 为了提高与非托管代码的互作性的性能,平台调用中的错误调用约定现在会导致应用程序失败。 在以前的版本中,封送层解决了堆栈上的这些错误。 在 Visual Studio 中调试应用程序时,Microsoft通知你这些错误,以便更正这些错误。

如果无法更新二进制文件,可以在应用程序的配置文件中包含<NetFx40_PInvokeStackResilience>元素,以便调用错误可以像在早期版本中一样沿堆栈解决。 但是,这可能会影响应用程序的性能。
已删除的接口 (非托管 API) 为了避免开发人员混淆,删除了以下接口,因为它们不提供任何有用的运行时方案,CLR 不提供或接受任何实现:

* INativeImageINativeImageDependency
* INativeImageInstallInfo
* INativeImageEvaluate
* INativeImageConverter
* ICorModule
* IMetaDataConverter
没有。

数据

本部分介绍使用数据集和 SQL 客户端、实体框架、LINQ to SQL 和 WCF 数据服务器的迁移问题(以前称为 ADO.NET 数据服务)。

数据集和 SQL 客户端

下表介绍了对以前存在限制或其他问题的功能的改进。

命名空间:System.DataSystem.Data.Objects.DataClassesSystem.Data.SqlClient

程序集:System.Data(System.Data.dll)、System.Data.Entity(System.Data.Entity.dll)

功能 / 特点 与 3.5 SP1 的差异
POCO 方案 IRelatedEnd 接口具有新方法,以提升其在普通CLR对象(POCO)场景中的可用性。 这些新方法采用Object而不是IEntityWithRelationships实体作为参数。
编辑行 方法 IndexOf (由 DataView 类实现)现在正确返回正在编辑的行的值,而不是返回 -1。
事件 当行处于修改状态并调用 PropertyChanged 方法时,将引发 RejectChanges 事件。 通过此更改,可以更轻松地创建公开对象内容的 DataSet UI 控件。
异常 在未设置或打开连接时,Prepare 方法现引发 InvalidOperationException 而非 NullReferenceException
映射视图 现在,在设计时捕获查询视图映射错误,而不是在运行时引发 NullReferenceException

映射验证现在捕获了概念架构(CSDL)中的两个关联集映射到同一列的错误。
交易 如果应用程序尝试在完成事务(包括中止或回退)后对连接执行某个语句,现将引发 InvalidOperationException。 以前的版本未引发异常,即使事务中止,也允许执行其他命令。

实体框架

下表介绍了对以前存在限制或其他问题的功能的改进。

命名空间:System.DataSystem.Data.ObjectsSystem.Data.Objects.DataClasses

程序集:System.Data.Entity(在 System.Data.Entity.dll 中)

功能 / 特点 与 3.5 SP1 的差异
实体对象 当调用Detach方法时,SaveChanges方法与实体对象的状态现在保持一致。 这可提高一致性,防止引发意外的异常。
实体 SQL 实体 SQL 中的标识符解析规则已得到改进。

实体 SQL 分析器改进了解析多部分标识符的逻辑。
结构批注 实体框架现在可识别结构注释。
查询 已在查询中进行以下改进:

GroupBy* 对空集合使用 null 键的查询不会返回任何行,不管查询中是否有任何其他选择。
* LINQ 和 Entity-SQL 查询中生成的 SQL 现在默认将字符串参数视为非 Unicode 值。

LINQ to SQL

下表介绍了对以前存在限制或其他问题的功能的改进。

Namespace: System.Data.Linq

程序集:System.Data.Linq(在 System.Data.Linq.dll 中)

功能 / 特点 与 3.5 SP1 的差异
事件 如果EntitySet<TEntity>被卸载,ListChanged集合现在会为添加和删除操作引发EntitySet<TEntity>事件,并且在集合加载时也会引发该事件。
查询 Skip(0) 在 LINQ to SQL 查询中不再被忽略。 因此,具有此方法的查询的行为可能有所不同。 例如,在某些情况下,需要OrderBy子句与Skip(0)一起使用,如果NotSupportedException子句未被包含,则查询现在将引发OrderBy异常。

WCF 数据服务

下表介绍了对以前存在限制或其他问题的功能的改进。

命名空间:System.Data.ServicesSystem.Data.Services.ClientSystem.Data.Services.CommonSystem.Data.Services.Providers

程序集:System.Data.Services(System.Data.Services.dll)、System.Data.Services.Client(System.Data.Services.Client.dll)

功能 / 特点 与 3.5 SP1 的差异
批处理二进制内容 WCF Data Services 现在支持请求和响应中的批处理二进制内容。
更改拦截器 现在会为删除请求执行更改侦听器。

更改拦截器是服务器每次接收到请求以修改实体集合中的实体时都会运行的方法。 它在执行传入请求之前运行。 更改侦听器提供对要更改的实体和要对该实体执行的操作的访问权限。
异常 以下情况现引发更有用的异常而不是 NullReferenceException

* 如果对数据服务的调用超时,引发 TimeoutException
* 在对数据服务发出错误请求时,引发 DataServiceRequestException

在应用程序中,应更改异常处理以捕获新异常。
标题 对标题进行了以下改进:

* WCF 数据服务现会正确地拒绝具有未指定的值的 eTag 标头。
* 当请求中包含 if-* 标头时,WCF Data Services 现在返回错误,并且不会执行链接删除请求。
* WCF Data Services 现在根据客户端在 Accept 头中指定的格式(Atom,JSON)向客户端返回错误。
JSON 读取器 如果 JavaScript 对象表示法 (JSON) 读取器在处理发送到 WCF 数据服务的 JSON 负载时读取到单个反斜杠 ("\") 转义字符,它现将正确返回一个错误。
合并 MergeOption 枚举进行了以下改进:

* MergeOption 合并选项不再修改客户端上的实体作为来自数据服务的任何后续响应的结果。
* 该 MergeOption 选项现在在动态 SQL 和基于存储过程的更新之间保持一致。
请求 现在在处理对数据服务的请求之前调用OnStartProcessingRequest方法。 这可使该请求对 ServiceOperation 服务正常工作。
WCF 数据服务不再关闭底层流来执行读写操作。
URI 已纠正 WCF 数据服务客户端对 URI 进行的转义。

Windows Communication Foundation (WCF)

下表介绍了对以前存在限制或其他问题的功能的改进。

功能 / 特点 与 3.5 SP1 的差异
配置文件 若要通过配置文件层次结构启用行为继承,WCF 现在支持跨配置文件合并。

配置继承模型现已展开,让用户定义将应用于计算机上运行的所有服务的行为。

如果在层次结构的不同级别存在具有相同名称的行为,则可能会遇到行为更改。
服务托管 无法通过将属性<serviceHostingEnvironment>添加到元素定义来在服务级别指定allowDefinition="MachineToApplication"配置元素。

指定 <serviceHostingEnvironment> 服务级别的元素在技术上不正确,并导致行为不一致。

Windows Presentation Foundation (WPF)

应用程序

命名空间: System.WindowsSystem.Windows.Controls

程序集:PresentationFramework(在 PresentationFramework.dll 中)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
异常处理 为了更早检测到错误,WPF 会引发 TargetInvocationException 并将 InnerException 属性设置为关键异常,例如 NullReferenceExceptionOutOfMemoryExceptionStackOverflowExceptionSecurityException,而不是捕获原始异常。 没有。
链接的资源 为了简化链接,位于项目文件夹结构以外的位置的资源文件(如图像)使用资源文件的完整路径,而不是在生成应用程序时将文件名用作资源 ID。 应用程序可以在运行时找到文件。 没有。
部分信任应用程序 为了安全起见,如果基于 Windows 的应用程序以部分信任的方式运行,并包含带有 HTML 的 WebBrowser 控件或 Frame 控件,则该应用程序会在创建该控件时引发 SecurityException

如果满足以下所有条件,浏览器应用程序将引发异常并显示消息:

* 应用程序在 Firefox 中运行。
* 该应用程序在来自非受信任站点的 Internet 区域中以部分信任方式运行。
* 应用程序包含一个 WebBrowser 控件或一个 Frame 包含 HTML 的控件。

从受信任的站点或 Intranet 区域运行的应用程序不会受到影响。
在浏览器应用程序中,可以通过执行以下作之一来简化此更改:

* 完全信任地运行浏览器应用程序。
* 让客户将应用程序的站点添加到受信任的站点区域。
资源字典 为了改进主题级资源字典并防止它们更改,资源字典中定义的可冻结资源并合并到主题级字典中现在始终标记为冻结且不可变。 这是可冻结资源的预期行为。 修改在主题级合并字典中定义的资源的应用程序应克隆资源并修改克隆的副本。 或者,可以标记 x:Shared="false" 资源,以便在 ResourceDictionary 每次查询资源时创建新副本。
Windows 7 若要使 WPF 应用程序在 Windows 7 上工作得更好,对更正窗口的行为进行了以下改进:

* 停靠和笔势状态现基于用户交互按预期方式工作。
* 任务栏命令 级联窗口、显示堆叠窗口并排显示窗口 现在具有正确的行为,并更新了相应的属性。
* 最大化TopLeftWidthHeight或最小化窗口的属性现在包含窗口的正确还原位置,而不是其他值,具体取决于监视器。
没有。
窗口样式和透明度 InvalidOperationExceptionWindowStyle并且WindowStyleAllowsTransparency时,如果将true设置为WindowState以外的值,则会抛出WindowState WindowStyleAllowsTransparency 时,如果必须更改 true,则可以调用 Win32 SetWindowLongPtr 函数。
XPS 查看器 WPF 不包含 Microsoft XML 纸张规范概要包(XPSEP)。 XPSEP 包含在 Windows 7 和 Windows Vista 中。

在运行 Windows XP 但未安装 .NET Framework 3.5 SP1 的计算机上,使用 PrintDialog 中以外的 WPF API 进行打印将依赖于 WINSPOOL。 不会报告某些打印机功能,某些打印机设置将不会在打印期间应用。
如果需要,请安装 Microsoft XML 文件规范 Essentials Pack。

控件

命名空间:System.WindowsSystem.Windows.ControlsSystem.Windows.DataSystem.Windows.Input

程序集:PresentationFramework(PresentationFramework.dll)、PresentationCore(PresentationCore.dll)、WindowsBase(WindowsBase.dll)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
对话框 为了提高可靠性,该方法 ShowDialog 在创建 FileDialog 控件的同一线程上调用。 请务必创建控件并在同一 FileDialog 线程上调用 ShowDialog 该方法。
浮动窗口 为了修复错误地保持对浮点窗口的重新激活(使窗口看上去像一个模式对话框)的焦点还原逻辑,如果候选项不是窗口的子级,现将会阻止焦点还原。 没有。
集合中的项 当一个项被移动或添加到基础集合时,如果CollectionView未排序,它会在CollectionView中显示在同一相对位置。 这在集合中和关联的 CollectionView项位置之间提供了一致性。 使用ContainerFromItemIndexOf方法来查找CollectionView中项的位置,而不是依赖项的固定位置。
布局 为了消除不必要的重新布局,更改 ShowsNavigationUI 不再使布局失效或启动新的布局过程。 如果预计更改 ShowsNavigationUI 将导致另一个布局过程,请在设置属性之后调用 InvalidateVisual
菜单 若要在菜单弹出窗口中启用 ClearType 文本,对ControlTemplate类以及MenuItem控件和其他控件进行了修改。 应用程序不应依赖于控件模板的可视结构。 只有 ControlTemplate 的命名部分才是公共协定的一部分。 如果应用程序必须在某个 ControlTemplate对象中找到特定对象,请在可视化树中搜索特定类型,而不是依赖树中对象的固定位置。
导航 Frame如果直接导航到某个位置,则IsNavigationInitiator属性位于true初始导航之后。 此更改可防止在启动方案中引发其他事件。 没有。
弹出窗口 在布局处理过程中现可多次调用 CustomPopupPlacementCallback 委托,而不是仅调用一次。 如果 CustomPopupPlacementCallback 委托根据其以前的位置计算 Popup 的位置,则仅当 popupSizetargetSizeoffset 参数的值发生更改时才需重新计算该位置。
属性值 现在,该方法 SetCurrentValue 允许将属性设置为有效值,尽管它仍然遵循任何影响该属性的绑定、样式或触发器。 每当属性值因其他操作(包括用户操作)的副作用而发生变化时,控件作者都应使用 SetCurrentValue
文本框 出于安全考虑,当在部分信任中调用CopyCut方法时,它们会悄然失败。

此外,在部分信任的方式下,还会禁止以编程方式对继承自 Copy 的控件执行 CutTextBoxBase 属性。 但是,用户启动的复制和剪切命令(如单击其 Command 属性绑定到其中一个命令的按钮)将起作用。 在部分信任方式下,通过键盘快捷方式和上下文菜单执行的标准复制和剪切仍像之前一样有效。
CopyCut 命令绑定到用户启动的作,例如单击按钮。

图形

命名空间:System.Windows、、System.Windows.ControlsSystem.Windows.DataSystem.Windows.InputSystem.Windows.Media.Effects

程序集:PresentationFramework(PresentationFramework.dll)、PresentationCore(PresentationCore.dll)、WindowsBase(WindowsBase.dll)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
位图效果 为了提高性能,尽管 BitmapEffect 类和继承自 BitmapEffect 类的其他类仍然存在,它们已被禁用。 如果以下条件成立,效果将通过硬件加速的渲染管道进行渲染:

* 应用程序会使用 DropShadowBitmapEffect 或半径属性设置为小于 100 DIU 的 BlurBitmapEffect
* 运行应用程序的计算机上的视频卡支持像素着色器 2.0。

如果未满足这些条件,则 BitmapEffect 对象将不起作用。

此外,Visual Studio 在遇到 BitmapEffect 对象或子类时会生成编译器警告。

该方法 PushEffect 标记为已过时。
停止使用旧 BitmapEffect 类和派生类,而是使用派生自 EffectBlurEffectDropShadowEffectShaderEffect的新类。

还可以通过从 ShaderEffect 类继承来创建自己的效果。
位图帧 克隆的BitmapFrame对象现在接收DownloadProgressDownloadCompletedDownloadFailed事件。 这使从网站下载并通过 Image 应用于 Style 控件的图像可正常工作。

仅当以下所有语句均为 true 时,才会看到行为更改:

* 订阅了 DownloadProgressDownloadCompletedDownloadFailed 事件。
* 源 BitmapFrame 来自 Web。
* 在下载仍在进行时对 BitmapFrame 进行了克隆。
在事件处理程序中检查发送方,仅当发送方是原始 BitmapFrame发件人时,才执行作。
解码图像 为了防止在图像无法解码时 IOException 未被正确处理,类 BitmapSource 会在图像解码失败时引发 DecodeFailed 事件。 删除任何异常处理 IOException,并使用 DecodeFailed 事件检查解码失败。

输入

命名空间:System.WindowsSystem.Windows.ControlsSystem.Windows.DataSystem.Windows.Input

程序集:PresentationFramework(PresentationFramework.dll)、PresentationCore(PresentationCore.dll)、WindowsBase(WindowsBase.dll)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
绑定命令实例 为提供一种机制,将基于视图模型的命令实例绑定到基于视图的输入手势,现在该InputBinding类继承自Freezable而不是DependencyObject。 以下属性现在是依赖属性:

* Command
* CommandParameter
* CommandTarget

此更改会导致以下结果:

* 注册之后,InputBinding 对象现处于冻结状态,而不是仍可变。
* 由于类的限制InputBinding,无法从多个线程访问实例级DependencyObject对象。
* 由于 Freezable 类的限制,无法在类注册后改变类级输入绑定。
* 不能在视图模型中创建的命令实例上指定输入绑定。
如果绑定是可变的,请在单独的线程上创建类的 InputBinding 单独实例,或者冻结它们。 注册类级静态 InputBinding 后,请勿将其改变。
浏览器应用程序 WPF 浏览器应用程序 (.XBAP)现在处理关键事件就像独立 WPF 应用程序一样,以便对象按正确的顺序接收路由的密钥事件。 没有。
死键组合 WPF 会对语音符号键进行模糊处理,这不会生成任何可见字符,而是指示该键将与下一个字母键组合使用以生成一个字符。 键输入事件(如KeyDownEvent事件)通过将属性设置为KeyKey值来报告键是否为死键。 这通常是预期行为,因为应用程序通常不打算响应创建组合字符的键盘输入。 期望读取组合字符组成键的应用程序可通过使用 DeadCharProcessedKey 属性,获取现经过模糊处理的键。
焦点管理器 FocusManager.GetFocusedElement(DependencyObject)当方法传递的元素设置为 IsFocusScope attached 属性true时,该方法将返回一个元素,该元素是该焦点范围中最后一个键盘焦点元素,前提是返回的元素与传递给该方法的元素属于同PresentationSource一对象。 没有。

用户界面自动化

命名空间:System.Windows、、System.Windows.Automation.PeersSystem.Windows.Automation.ProviderSystem.Windows.ControlsSystem.Windows.DataSystem.Windows.Input

程序集:PresentationFramework(PresentationFramework.dll)、PresentationCore(PresentationCore.dll)、UIAutomationProvider(UIAutomationProvider.dll)、WindowsBase(WindowsBase.dll)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
视图的类层次结构 TreeViewAutomationPeerTreeViewItemAutomationPeer 类继承自 ItemsControlAutomationPeer,而不是 FrameworkElementAutomationPeer 如果继承自 TreeViewItemAutomationPeer 类并重写 GetChildrenCore 方法,请考虑返回继承自新 TreeViewDataItemAutomationPeer 类的对象。
离开屏幕的容器 为了纠正错误的返回值,如果项容器滚动到视图之外,IsOffscreenCore 方法现正确返回 false。 此外,该方法的值不受其他窗口的遮挡影响,或者该元素是否在特定监视器上可见。 没有。
菜单和子对象 为了启用包含除 MenuItem 对象以外子项的菜单的 UI 自动化,现在方法 GetChildrenCore 返回子 AutomationPeer 对象的 UIElement 对象,而不是 MenuItemAutomationPeer 对象。 没有。
新接口和程序集 若要为 UI 自动化启用新功能,添加了以下接口:

* IItemContainerProvider
* ISynchronizedInputProvider
* IVirtualizedItemProvider
生成 WPF 自动化对等的任何项目都必须添加对 UIAutomationProvider.dll 的显式引用。
拇指 该方法 GetClassNameCore 返回一个值,而不是 null。 因此,继承自GridSplitter类的控件Thumb将向 UI 自动化报告名称。 没有。
虚拟化元素 为了提高性能,该方法 GetChildrenCore 仅返回实际位于可视化树中的子对象,而不是所有子对象,而不考虑它们是否虚拟化。 使用 ItemContainerPattern 循环访问 ItemsControlAutomationPeer 的所有项。

XAML

命名空间:System.Windows、、System.Windows.ControlsSystem.Windows.DataSystem.Windows.InputSystem.Windows.Markup

程序集:PresentationFramework(PresentationFramework.dll)、PresentationCore(PresentationCore.dll)、WindowsBase(WindowsBase.dll)

功能 / 特点 与 3.5 SP1 的差异 建议的更改
标记扩展 WPF 现在始终正确地使用来自 ProvideValue 方法的值,而不是在某些情况下使用标记扩展来设置属性或在集合中创建项时返回 MarkupExtension 对象。 标记扩展在某些情况下可能会返回自身。 如果您的应用程序访问了在早期版本中返回MarkupExtension对象的资源,请引用从ProvideValue返回的对象,而不是MarkupExtension对象。
分析属性 XAML 中的特性现可只具有一个句点。 例如,以下是有效的:

<Button Background="Red"/> (无句点)

<Button Button.Background = "Red"/>(一个句点)

以下内容不再有效:

<Button Control.Button.Background = "Red"/> (多个时间段)
更正具有多个句点的 XAML 特性。

XML

此表中的行描述了对以前存在限制或其他问题的功能的改进。

架构和转换

命名空间: System.Xml.Linq; , System.Xml.SchemaSystem.Xml.XPath

程序集:System.Xml(System.Xml.dll)、System.Xml.Linq(System.Xml.Linq.dll)

功能 / 特点 与 3.5 SP1 的差异
Chameleon 架构 为了防止数据损坏,现在,当变色龙模式包含在多个模式中时,它们将被正确克隆。

Chameleon 架构是没有目标命名空间的架构,当它们包含在另一个 XSD 中时,它们将采用导入架构的目标命名空间。 它们通常用于将常见类型包含在架构中。
ID 函数 当对象传递到 XLST 时,XSLT XmlReader现在返回正确的值,而不是 null。

如果用户使用XmlReader方法从 LINQ to XML 类创建了CreateReader对象,并将此XmlReader对象传递到 XSLT,那么 XSLT 中id函数的任何实例以前都会返回 null。 这不是 id 函数允许的返回值。
命名空间属性 为了防止数据损坏,对象 XPathNavigator 现在正确返回属性的 x:xmlns 本地名称。
命名空间声明 XmlReader子树上的对象不再在一个 XML 元素中创建重复的命名空间声明。
架构验证 为了防止错误架构验证,类 XmlSchemaSet 允许正确且一致地编译 XSD 架构。 这些架构可以包括其他架构;例如, A.xsd 可以包含 B.xsd,可以包括 C.xsd。 编译其中任一项会导致遍历此依赖项关系图。
脚本函数 当函数实际可用时,函数 可用函数 不再错误返回 false
URI 该方法 Load 现在在 LINQ 查询中返回正确的 BaseURI。

验证

命名空间: System.Xml.Linq; , System.Xml.SchemaSystem.Xml.XPath

程序集:System.Xml(System.Xml.dll)、System.Xml.Linq(System.Xml.Linq.dll)

功能 / 特点 与 3.5 SP1 的差异
命名空间解析程序 ReadContentAs 方法不再忽略传递给它的 IXmlNamespaceResolver 解析器。

在以前的版本中,指定的命名空间解析程序被忽略,而改用了 XmlReader
空白 为了在创建读取器时防止数据丢失,Create 方法不再丢弃有意义的空格。

XML 验证可识别混合内容模式,其中文本可与 XML 标记混合。 在混合模式下,所有空白都很重要,应报告。

编写

命名空间: System.Xml.Linq; , System.Xml.SchemaSystem.Xml.XPath

程序集:System.Xml(System.Xml.dll)、System.Xml.Linq(System.Xml.Linq.dll)

功能 / 特点 与 3.5 SP1 的差异
实体引用 为了防止数据损坏,现在不再对 XML 属性中的实体引用进行双重转换。

如果用户尝试使用xmlns方法将实体写入xml:lang属性或xml:spaceWriteEntityRef属性中,则该实体在输出中被实体化两次,从而损坏了数据。
新行处理 为了防止数据损坏, XmlWriter 对象会遵循 NewLineHandling 该选项。

另请参阅