Memvalidasi paket terhadap runtime yang berbeda
Anda dapat memilih untuk memiliki rakitan implementasi yang berbeda untuk runtime yang berbeda dalam paket NuGet Anda. Dalam hal ini, Anda perlu memastikan bahwa rakitan ini kompatibel satu sama lain dan dengan rakitan waktu kompilasi.
Misalnya, pertimbangkan skenario berikut. Anda sedang mengerjakan pustaka yang melibatkan beberapa panggilan interop ke API Unix dan Windows. Anda telah menulis kode berikut:
#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
Struktur paket yang dihasilkan terlihat sebagai berikut.
lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll
lib\net6.0\A.dll
selalu digunakan pada waktu kompilasi, terlepas dari sistem operasi yang mendasar. lib\net6.0\A.dll
juga digunakan pada waktu proses untuk sistem non-Unix. Namun, runtimes\unix\lib\net6.0\A.dll
digunakan pada waktu proses untuk sistem Unix.
Ketika Anda mencoba untuk mengemas proyek ini, Anda mendapatkan kesalahan berikut:
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]
Anda menyadari kesalahan Anda dan menambahkan A.B.Open(string)
ke runtime Unix juga.
#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
Anda mencoba mengemas proyek lagi, dan berhasil.
Mode ketat
Anda dapat mengaktifkan mode ketat untuk validator ini dengan mengatur EnableStrictModeForCompatibleTfms
properti dalam file proyek Anda. Mengaktifkan mode ketat mengubah beberapa aturan, dan beberapa aturan lain akan dijalankan saat mendapatkan perbedaannya. Ini berguna ketika Anda ingin kedua belah pihak Anda membandingkan dengan benar-benar sama pada area permukaan dan identitas mereka. Untuk informasi selengkapnya, lihat Mode ketat.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk