在 ASP.NET Core 3.0 和 3.1 中,RenderTreeFrame 结构体公开了各种 readonly public 字段,包括 FrameType、Sequence 和其他字段。 在 ASP.NET Core 5.0 RC1 及更高版本中,所有 readonly public 字段都更改为 readonly public 属性。
此更改不会影响许多开发人员,因为:
- 任何仅使用
.razor文件(甚至手动 RenderTreeBuilder 调用)来定义其组件的应用或库都不会直接引用此类型。 - 类型
RenderTreeFrame本身被视为仅限于框架内部使用的实现细节。 ASP.NET Core 3.0 及更高版本包括一个分析器,在直接使用该类型时发出编译器警告。 - 即使直接引用
RenderTreeFrame,此更改也会破坏二进制兼容性,但不会破坏源代码兼容性。 也就是说,现有源代码将编译并正常运行。 如果针对 .NET Core 3.x 框架进行编译,然后针对 .NET 5 或更高版本的框架运行这些二进制文件,则只会遇到问题。
有关讨论,请参阅 GitHub 问题 dotnet/aspnetcore#25727。
已引入的版本
5.0 RC1
旧行为
RenderTreeFrame 上的公共成员被定义为字段。 例如,renderTreeFrame.Sequence 和 renderTreeFrame.ElementName。
新行为
RenderTreeFrame 上的公共成员被定义名称与以前相同的属性。 例如,renderTreeFrame.Sequence 和 renderTreeFrame.ElementName。
如果自此更改以来尚未重新编译旧的预编译代码,则它可能会引发类似于 MissingFieldException 的异常:找不到字段:“Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType”。
更改原因
此更改是在 ASP.NET Core 5.0 中实现 Razor 组件呈现中的高影响性能改进所必需的。 维护相同的安全和封装级别。
建议的措施
大多数 Blazor 开发人员不受此更改影响。 更改更有可能影响库和包作者,但仅在极少数情况下。 具体来说,如果你要执行以下操作:
- 开发一款应用,并使用 ASP.NET Core 3.x 或者升级到 5.0 RC1 或更高版本,则无需更改自己的代码。 但是,如果你依赖于升级为考虑此更改的库,则需要更新到该库的较新版本。
- 如果一个库只需支持 ASP.NET Core 5.0 RC1 或更高版本,则无需执行任何操作。 只需确保项目文件中声明了
<TargetFramework>值为net5.0或更高版本即可。 - 开发一个库,并希望支持 ASP.NET Core 3.x 和 5.0,则需要确定代码是否读取任何 成员
RenderTreeFrame。 例如,计算someRenderTreeFrame.FrameType。- 大多数库不会读取
RenderTreeFrame成员,包括包含.razor组件的库。 在这种情况下,无需采取任何行动。 - 但是,如果你的库执行此操作,则你需要进行多目标操作以同时支持
netstandard2.1和net5.0。 在项目文件中应用以下更改:将现有
<TargetFramework>元素替换为<TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>.使用条件
Microsoft.AspNetCore.Components包引用以兼容您希望支持的两个版本。 例如:<PackageReference Include="Microsoft.AspNetCore.Components" Version="3.0.0" Condition="'$(TargetFramework)' == 'netstandard2.0'" /> <PackageReference Include="Microsoft.AspNetCore.Components" Version="5.0.0-rc.1.*" Condition="'$(TargetFramework)' != 'netstandard2.0'" />
- 大多数库不会读取
有关进一步的说明,请参阅此diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement library。