Überprüfen kompatibler Frameworks

Pakete, die kompatible Frameworks enthalten, müssen sicherstellen, dass ein für ein Framework kompilierter Code für ein anderes ausgeführt werden kann. Beispiele für kompatible Frameworkpaare:

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

In beiden Fällen können Consumer für .NET Standard 2.0 oder NET 6 kombiniert und unter .NET 7 ausgeführt werden. Wenn Ihre Binärdateien zwischen diesen Frameworks nicht kompatibel sind, können Consumer zu Kompilierzeit- oder Laufzeitfehlern führen.

Die Paketvalidierung fängt diese Fehler zur Packzeit ab. Hier ist ein Beispielszenario:

Angenommen, Sie schreiben ein Spiel, das Zeichenfolgen bearbeitet. Sie müssen sowohl .NET Framework- als auch .NET-Consumer (.NET Core) unterstützen. Ursprünglich war 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 tritt der folgende Fehler auf:

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

Anstatt DoStringManipulation(string) für .NET 6 auszuschließen, sollten Sie lediglich eine zusätzliche DoStringManipulation(ReadOnlySpan<char>)-Methode für .NET 6 bereitstellen:

#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 es ist erfolgreich.

CompatibleFrameworksSuccessful

Strict-Modus

Sie können den Strict-Modus für dieses Validierungssteuerelement aktivieren, indem Sie die EnableStrictModeForCompatibleFrameworksInPackage-Eigenschaft in Ihrer Projektdatei festlegen. Durch das Aktivieren des strict-Modus werden einige Regeln geändert und einige andere Regeln ausgeführt, wenn die Unterschiede erkannt werden. Dies ist nützlich, wenn Sie möchten, dass beide Seiten, die Sie vergleichen, hinsichtlich ihrer Oberfläche und Identität identisch sind. Weitere Informationen finden Sie unter Strict-Modus.