Dela via


Verifiera paket mot olika körningsmiljöer

Du kan välja att ha olika implementeringssammansättningar för olika körningar i ditt NuGet-paket. I så fall måste du se till att dessa sammansättningar är kompatibla med varandra och med kompileringstidssammansättningarna.

Tänk dig till exempel följande scenario. Du arbetar med ett bibliotek med några interop-anrop till Unix- respektive Windows-API:er. Du har skrivit följande kod:

#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

Den resulterande paketstrukturen ser ut så här.

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

lib\net6.0\A.dll används alltid vid kompileringstillfället, oavsett det underliggande operativsystemet. lib\net6.0\A.dll används också under körning för icke-Unix-system. Dock används runtimes\unix\lib\net6.0\A.dll vid körning på Unix-system.

När du försöker packa det här projektet får du följande fel:

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]

MultipleRuntimes

Du inser ditt misstag och lägger även till A.B.Open(string) i Unix-miljön.

#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

Du försöker packa projektet igen och det lyckas.

MultipleRuntimesSuccessful

Strikt läge

Du kan aktivera strikt läge för den här valideraren genom att ange EnableStrictModeForCompatibleTfms egenskapen i projektfilen. Om du aktiverar strikt läge ändras vissa regler, och andra regler kommer att genomföras när skillnaderna identifieras. Detta är användbart när du vill att båda sidorna ska jämföras med strikt samma i fråga om yta och identitet. Mer information finns i Strikt läge.