Paketleri farklı çalışma zamanlarında doğrulama

NuGet paketinizde farklı çalışma zamanları için farklı uygulama derlemeleri olmasını seçebilirsiniz. Bu durumda, bu derlemelerin birbiriyle ve derleme zamanı derlemeleriyle uyumlu olduğundan emin olmanız gerekir.

Örneğin aşağıdaki senaryoları düşünün. Sırasıyla Unix ve Windows API'lerine yönelik bazı birlikte çalışma çağrılarını içeren bir kitaplık üzerinde çalışıyorsunuz. Aşağıdaki kodu yazdınız:

#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

Sonuçta elde edilen paket yapısı aşağıdaki gibi görünür.

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

lib\net6.0\A.dll , temel alınan işletim sisteminden bağımsız olarak her zaman derleme zamanında kullanılır. lib\net6.0\A.dll , Unix olmayan sistemler için çalışma zamanında da kullanılır. Ancak, runtimes\unix\lib\net6.0\A.dll Unix sistemleri için çalışma zamanında kullanılır.

Bu projeyi paketlemeye çalıştığınızda aşağıdaki hatayı alırsınız:

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

Hatanızın farkındasınız ve Unix çalışma zamanına da eklisiniz A.B.Open(string) .

#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

Projeyi yeniden paketlemeye çalışırsınız ve başarılı olur.

MultipleRuntimesSuccessful

Katı mod

Proje dosyanızda özelliğini ayarlayarakEnableStrictModeForCompatibleTfms bu doğrulayıcı için katı modu etkinleştirebilirsiniz. Katı modun etkinleştirilmesi bazı kuralları değiştirir ve farklar alınırken bazı diğer kurallar yürütülür. Bu, karşılaştırdığınız her iki tarafın da yüzey alanında ve kimliklerinde tamamen aynı olmasını istediğinizde kullanışlıdır. Daha fazla bilgi için bkz . Katı mod.