Blazor: Schreibgeschützte öffentliche RenderTreeFrame-Felder sind jetzt Eigenschaften
In ASP.NET Core 3.0 und 3.1 machte die RenderTreeFrame-Struktur verschiedene readonly public
-Felder verfügbar, u. a. FrameType und Sequence. Ab ASP.NET Core 5.0 RC1 wurden alle readonly public
-Felder in readonly public
-Eigenschaften geändert.
Diese Änderung wirkt sich aus folgenden Gründen nicht auf viele Entwickler aus:
- Jede Anwendung oder Bibliothek, die einfach
.razor
-Dateien (oder sogar manuelle RenderTreeBuilder-Aufrufe) verwendet, um ihre Komponenten zu definieren, würde nicht direkt auf diesen Typ verweisen. - Der Typ
RenderTreeFrame
selbst wird als Implementierungsdetail betrachtet, das nicht für eine Verwendung außerhalb des Frameworks vorgesehen ist. Ab ASP.NET Core 3.0 steht ein Analysetool zur Verfügung, das Compilerwarnungen ausgibt, wenn der Typ direkt verwendet wird. - Selbst wenn Sie direkt auf
RenderTreeFrame
verweisen, ist diese Änderung ein binärer Breaking Change, aber kein Breaking Change im Quellcode. Das heißt, dass der vorhandene Quellcode kompiliert wird und sich verhält ordnungsgemäß. Sie werden nur dann auf ein Problem stoßen, wenn Sie mit einem .NET Core 3.x-Framework kompilieren und diese Binärdateien dann mit dem .NET 5-Framework oder höher ausführen.
Weitere Informationen finden Sie unter GitHub-Issue dotnet/aspnetcore#25727.
Eingeführt in Version
5.0 RC1
Altes Verhalten
Öffentliche Member in RenderTreeFrame
werden als Felder definiert. Beispiel: renderTreeFrame.Sequence
und renderTreeFrame.ElementName
.
Neues Verhalten
Öffentliche Member in RenderTreeFrame
werden als Eigenschaften mit denselben Namen wie zuvor definiert. Beispiel: renderTreeFrame.Sequence
und renderTreeFrame.ElementName
.
Wenn älterer vorkompilierter Code seit dieser Änderung nicht neu kompiliert wurde, kann er eine Ausnahme ähnlich dieser auslösen: MissingFieldException: Feld nicht gefunden: Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType.
Grund für die Änderung
Diese Änderung war notwendig, um erhebliche Leistungsverbesserungen beim Rendering von Razor-Komponenten in ASP.NET Core 5.0 zu implementieren. Die gleichen Sicherheits- und Kapselungsebenen bleiben erhalten.
Empfohlene Maßnahme
Die meisten Blazor-Entwickler sind von dieser Änderung nicht betroffen. Die Änderung betrifft eher Ersteller von Bibliotheken und Paketen, aber nur in seltenen Fällen. Das gibt insbesondere, wenn Sie Folgendes entwickeln:
- Eine App und mit ASP.NET Core 3.x arbeiten oder ein Upgrade auf mindestens 5.0 RC1 vornehmen. Dann brauchen Sie Ihren eigenen Code nicht zu ändern. Wenn Sie jedoch von einer Bibliothek abhängig sind, für die ein Upgrade erfolgt ist, um diese Änderung zu berücksichtigen, müssen Sie auf eine neuere Version dieser Bibliothek aktualisieren.
- Eine Bibliothek und nur ASP.NET Core 5.0 RC1 oder höher unterstützen möchten. Dann ist keine Aktion erforderlich. Stellen Sie einfach sicher, dass Ihre Projektdatei den
<TargetFramework>
-Wertnet5.0
oder eine spätere Version deklariert. - Eine Bibliothek und Sie sowohl ASP.NET Core 3.x und 5.0 unterstützen möchten. Dann müssen Sie bestimmen, ob Ihr Code
RenderTreeFrame
-Member liest. Beispielsweise beim Auswerten vonsomeRenderTreeFrame.FrameType
.- Die meisten Bibliotheken lesen keine
RenderTreeFrame
-Member, einschließlich Bibliotheken mit.razor
-Komponenten. In diesem Fall ist keine Aktion erforderlich. - Wenn Ihre Bibliothek dies jedoch tut, müssen Sie mehrere Ziele abdecken, um sowohl
netstandard2.1
als auchnet5.0
zu unterstützen. Wenden Sie die folgenden Änderungen in Ihrer Projektdatei an:Ersetzen Sie das vorhandene
<TargetFramework>
-Element durch<TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>
.Verwenden Sie einen bedingten Verweis auf das
Microsoft.AspNetCore.Components
-Paket, um beide Versionen zu berücksichtigen, die Sie unterstützen möchten. Zum Beispiel:<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'" />
- Die meisten Bibliotheken lesen keine
Weitere Erläuterungen finden Sie unter diff showing how @jsakamoto already upgraded the Toolbelt.Blazor.HeadElement
library.