Condividi tramite


Convalidare i pacchetti in runtime diversi

È possibile scegliere di avere assembly di implementazione diversi per runtime diversi nel pacchetto NuGet. In tal caso, è necessario assicurarsi che questi assembly siano compatibili tra loro e con gli assembly in fase di compilazione.

Si consideri ad esempio lo scenario seguente. Si sta lavorando a una libreria che coinvolge alcune chiamate di interoperabilità alle API Unix e Windows, rispettivamente. Il codice seguente è stato scritto:

#if Unix
    public static void Open(string path, bool securityDescriptor)
    {
        // Call Unix specific stuff.
    }
#else
    public static void Open(string path)
    {
        // Call Windows specific stuff.
    }
#endif

La struttura del pacchetto risultante è simile alla seguente.

lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll

lib\net6.0\A.dll viene sempre usato in fase di compilazione, indipendentemente dal sistema operativo sottostante. lib\net6.0\A.dll viene usato anche in fase di esecuzione per sistemi non Unix. Tuttavia, runtimes\unix\lib\net6.0\A.dll viene usato in fase di esecuzione per i sistemi Unix.

Quando si tenta di comprimere questo progetto, viene visualizzato l'errore seguente:

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
  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.Open(string)' exists on lib/net6.0/PackageValidationThrough.dll but not on runtimes/unix/lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]
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.Open(string, bool)' exists on runtimes/unix/lib/net6.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

Ambienti di Esecuzione Multipli

Ti rendi conto del tuo errore e aggiungi A.B.Open(string) anche al runtime Unix.

#if Unix
    public static void Open(string path, bool securityDescriptor)
    {
        // Call Unix specific stuff.
    }

    public static void Open(string path)
    {
        throw new PlatformNotSupportedException();
    }
#else
    public static void Open(string path)
    {
        // Call Windows specific stuff.
    }

    public static void Open(string path, bool securityDescriptor)
    {
        throw new PlatformNotSupportedException();
    }
#endif

Si tenta di comprimere di nuovo il progetto e l'operazione ha esito positivo.

MultipleRuntimesSuccessful

Modalità strict

È possibile abilitare la modalità strict per questo validator impostando la EnableStrictModeForCompatibleTfms proprietà nel file di progetto. L'abilitazione della modalità strict modifica alcune regole e alcune altre regole verranno eseguite quando si ottengono le differenze. Ciò è utile quando si desidera che entrambi i lati a confronto siano strettamente identici per area di superficie e identità. Per ulteriori informazioni, vedere Modalità rigida.