Uyarı CA1416: Platform uyumluluğu
.NET kod çözümleyici kuralı CA1416 , .NET 5'te başlayarak varsayılan olarak etkindir. İşletim sistemini doğrulamayan çağrı sitelerinden platforma özgü API'lere yapılan çağrılar için bir derleme uyarısı oluşturur.
Açıklama değiştirildi
.NET 5'den başlayarak .NET SDK'sı .NET kaynak kodu çözümleyicilerini içerir. Ca1416 da dahil olmak üzere bu kuralların bazıları varsayılan olarak etkindir. Projeniz bu kuralı ihlal eden bir kod içeriyorsa ve uyarıları hata olarak değerlendirecek şekilde yapılandırılmışsa, bu değişiklik derlemenizi bozabilir. KURAL CA1416, platform bağlamı doğrulanmamış yerlerdeki platforma özgü API'leri kullandığınızda sizi bilgilendirır.
Kural CA1416, platform uyumluluk çözümleyicisi, .NET 5'te yeni olan diğer bazı özelliklerle birlikte çalışır. .NET 5, bir API'nin desteklendiği veya desteklenmediği platformları SupportedOSPlatformAttribute belirtmenize olanak tanıyan ve UnsupportedOSPlatformAttribute'yi tanıtır. Bu özniteliklerin olmaması halinde tüm platformlarda bir API'nin desteklendiği varsayılır. Bu öznitelikler, çekirdek .NET kitaplıklarındaki platforma özgü API'lere uygulanmıştır.
Kullandıkları API'lerin kullanılamadığı platformları hedefleyen projelerde, ca1416 kuralı platform bağlamının doğrulanmamış olduğu platforma özgü API çağrılarını işaretler. Artık ve UnsupportedOSPlatformAttribute öznitelikleriyle SupportedOSPlatformAttribute süslenen API'lerin çoğu, desteklenmeyen bir işletim sisteminde çağrıldıklarında özel durumlar oluştururPlatformNotSupportedException. Artık bu API'ler platforma özgü olarak işaretlendiklerine göre, CA1416 kuralı, arama sitelerinize işletim sistemi denetimleri ekleyerek çalışma zamanı PlatformNotSupportedException özel durumlarını önlemenize yardımcı olur.
Örnekler
Console.Beep(Int32, Int32) yöntemi yalnızca Windows'ta desteklenir ve ile
[SupportedOSPlatform("windows")]
dekore edilmiştir. Aşağıdaki kod, proje hedef alıyorsa (platformlarnet5.0
arası) derleme zamanında bir CA1416 uyarısı oluşturur. Ancak bu kod, projenin Windows'un (net5.0-windows
) hedeflenip hedeflenmediğini veGenerateAssemblyInfo
proje için etkinleştirilip etkinleştirilmediğini uyarmaz. Uyarıyı önlemek için gerçekleştirebileceğiniz eylemler için bkz . Önerilen eylem.public void PlayCMajor() { Console.Beep(261, 1000); }
Image.FromFile(String) yöntemi tarayıcıda desteklenmez ve ile
[UnsupportedOSPlatform("browser")]
dekore edilmiştir. Aşağıdaki kod, proje tarayıcı platformunu destekliyorsa derleme zamanında bir CA1416 uyarısı oluşturur.public void CreateImage() { Image newImage = Image.FromFile("SampImag.jpg"); }
İpucu
Blazor WebAssembly projeleri ve Razor sınıf kitaplığı projeleri otomatik olarak tarayıcı desteği içerir. Tarayıcıyı projeniz için desteklenen bir platform olarak el ile eklemek için proje dosyanıza aşağıdaki girdiyi ekleyin:
<ItemGroup> <SupportedPlatform Include="browser" /> </ItemGroup>
Sürüm kullanıma sunulmuştur
5.0
Önerilen eylem
Platforma özgü API'lerin yalnızca kod uygun bir platformda çalışırken çağrıldığından emin olun. Platforma özgü bir API'yi çağırmadan önce, sınıfındaki System.OperatingSystem OperatingSystem.IsWindows()yöntemlerden birini Is<Platform>
kullanarak geçerli işletim sistemini de kontrol edebilirsiniz.
Deyim koşulunda if
yöntemlerden birini Is<Platform>
kullanabilirsiniz:
public void PlayCMajor()
{
if (OperatingSystem.IsWindows())
{
Console.Beep(261, 1000);
}
}
Alternatif olarak, çalışma zamanında ek if
bir deyimin ek yükünü istemiyorsanız, bunun yerine şunu çağırın Debug.Assert(Boolean) :
public void PlayCMajor()
{
Debug.Assert(OperatingSystem.IsWindows());
Console.Beep(261, 1000);
}
Kitaplık yazarsanız API'nizi platforma özgü olarak işaretleyebilirsiniz. Bu durumda, gereksinimleri denetleme yükü arayanlarınıza düşer. Belirli yöntemleri veya türleri ya da bütün bir derlemeyi işaretleyebilirsiniz.
[SupportedOSPlatform("windows")]
public void PlayCMajor()
{
Console.Beep(261, 1000);
}
Tüm arama sitelerinizi düzeltmek istemiyorsanız, uyarıyı engellemek için aşağıdaki seçeneklerden birini belirleyebilirsiniz:
Kuralı CA1416'yı engellemek için, bunu kullanarak veya NoWarn derleyici bayrağını kullanarak
#pragma
ya da kuralın önem derecesininone
bir .editorconfig dosyasında olarak ayarlayarak yapabilirsiniz.public void PlayCMajor() { #pragma warning disable CA1416 Console.Beep(261, 1000); #pragma warning restore CA1416 }
Kod analizini tamamen devre dışı bırakmak için proje dosyanızda olarak
false
ayarlayınEnableNETAnalyzers
. Daha fazla bilgi için bkz . EnableNETAnalyzers.
Etkilenen API’ler
Windows platformu için:
- konumunda listelenen tüm API'ler https://github.com/dotnet/designs/blob/main/accepted/2020/windows-specific-apis/windows-specific-apis.md.
- System.Security.Cryptography.DSAOpenSsl
- System.Security.Cryptography.ECDiffieHellmanOpenSsl
- System.Security.Cryptography.ECDsaOpenSsl
- System.Security.Cryptography.RSAOpenSsl
Blazor WebAssembly platformu için:
- konumunda listelenen tüm API'ler https://github.com/dotnet/runtime/issues/41087.