Freigeben über


Validieren kompatibler Frameworks

Pakete mit kompatiblen Frameworks müssen sicherstellen, dass Code, der gegen eines kompiliert wurde, auch gegen ein anderes ausgeführt werden kann. Beispiele für kompatible Framework-Paare sind:

  • .NET Standard 2.0 und .NET 7
  • .NET 6 und .NET 7

In beiden Fällen können Entwickler gegen .NET Standard 2.0 oder .NET 6 entwickeln und unter .NET 7 ausführen. Wenn Ihre Binärdateien nicht zwischen diesen Frameworks kompatibel sind, könnten Endbenutzer Kompilierungs- oder Laufzeitfehler erleben.

Bei der Paketüberprüfung werden diese Fehler beim Packen erfasst. Hier ist ein Beispielszenario:

Angenommen, Sie schreiben ein Spiel, das Zeichenfolgen bearbeitet. Sie müssen .NET Framework- und .NET Core-Consumer unterstützen. Ursprünglich haben Sie Ihr Projekt auf .NET Standard 2.0 ausgerichtet, aber jetzt möchten Sie Span<T> in .NET 6 nutzen, um unnötige Zeichenfolgenzuweisungen zu vermeiden. Dazu möchten Sie mehrere Ziele für .NET Standard 2.0 und .NET 6 erstellen.

Sie haben den folgenden Code geschrieben:

#if NET6_0_OR_GREATER
    public void DoStringManipulation(ReadOnlySpan<char> input)
    {
        // use spans to do string operations.
    }
#else
    public void DoStringManipulation(string input)
    {
        // Do some string operations.
    }
#endif

Anschließend versuchen Sie, das Projekt zu packen (entweder mit dotnet pack oder Visual Studio), und es schlägt mit dem folgenden Fehler fehl:

D:\demo>dotnet pack
Microsoft (R) Build Engine version 17.0.0-preview-21460-01+8f208e609 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
  You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
  PackageValidationThrough -> D:\demo\bin\Debug\netstandard2.0\PackageValidationThrough.dll
  PackageValidationThrough -> D:\demo\bin\Debug\net6.0\PackageValidationThrough.dll
  Successfully created package 'D:\demo\bin\Debug\PackageValidationThrough.1.0.0.nupkg'.
C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.DoStringManipulation(string)' exists on lib/netstandard2.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

CompatibleFrameworks

Sie erkennen, dass Sie, anstatt DoStringManipulation(string) für .NET 6 auszuschließen, einfach nur eine zusätzliche DoStringManipulation(ReadOnlySpan<char>)-Methode für .NET 6 bereitstellen sollten.

#if NET6_0_OR_GREATER
    public void DoStringManipulation(ReadOnlySpan<char> input)
    {
        // use spans to do string operations.
    }
#endif
    public void DoStringManipulation(string input)
    {
        // Do some string operations.
    }

Sie versuchen, das Projekt erneut zu packen, und der Vorgang ist erfolgreich.

CompatibleFrameworksSuccessful

Strict-Modus

Sie können den strikten Modus für diesen Validator aktivieren, indem Sie die EnableStrictModeForCompatibleFrameworksInPackage Eigenschaft in Der Projektdatei festlegen. Das Aktivieren des strengen Modus ändert einige Regeln und führt einige andere Regeln aus, wenn die Unterschiede angezeigt werden. Dies ist nützlich, wenn Sie möchten, dass beide Seiten, die Sie vergleichen, im Oberflächenbereich und in ihrer Identität streng gleich sind. Weitere Informationen finden Sie im Strict-Modus.