CA1422:驗證平臺相容性 - 已過時的 API
屬性 | 值 |
---|---|
規則識別碼 | CA1422 |
標題 | 驗證平臺相容性 - 已過時的 API |
類別 | 互通性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | 作為警告 |
原因
標記的 ObsoletedOSPlatformAttribute API 會從標示為支援過時作業系統 (OS) 的呼叫月臺呼叫。 此規則類似于 CA1416:驗證平臺相容性 ,不同之處在于它會警告指定平臺上已過時的 API,而不是完全不受支援。
檔案描述
不建議從該 OS (版本) 連線的呼叫網站呼叫在指定 OS (版本) 中過時的 API。 請考慮改為呼叫非過時的 API,或防止在受影響的作業系統上呼叫過時的 API。
如何修正違規
有各種方法可以修正此規則的違規:
- 將呼叫月臺限制為未包含已淘汰版本的作業系統,方法是使用 UnsupportedOSPlatformAttribute 或 ObsoletedOSPlatformAttribute 標記。
- 使用 System.OperatingSystem API 保護呼叫,例如
if (!OperatingSystem.IsLinux())
。 - 使用標注或 UnsupportedOSPlatformGuardAttribute 否定 SupportedOSPlatformGuardAttribute 的 API 保護呼叫。
範例
下列程式碼片段顯示 CA1422 違規:
[SupportedOSPlatform("Windows")]
public void M1()
{
// Violates rule CA1422.
// This call site is reachable on 'Windows',
// but 'ObsoletedOnWindows62()'
// is obsoleted on 'Windows 6.2' and later.
ObsoletedOnWindows62();
}
[ObsoletedOSPlatform("Windows6.2")]
public void ObsoletedOnWindows62()
{ }
<SupportedOSPlatform("Windows")>
Public Sub M1()
' Violates rules CA1422.
' This call site is reachable on 'Windows',
' but 'ObsoletedOnWindows62()'
' is obsoleted on 'Windows 6.2' and later.
ObsoletedOnWindows62()
End Sub
<ObsoletedOSPlatform("Windows6.2")>
Public Sub ObsoletedOnWindows62()
End Sub
下列程式碼片段會藉由將 屬性新增至呼叫網站 UnsupportedOSPlatformAttribute ,以修正違規,該屬性會指定所呼叫方法已過時的版本。
[SupportedOSPlatform("Windows")]
[ObsoletedOSPlatform("Windows6.2")]
public void M1()
{
ObsoletedOnWindows62();
}
[ObsoletedOSPlatform("Windows6.2")]
public void ObsoletedOnWindows62()
{ }
<SupportedOSPlatform("Windows")>
<ObsoletedOSPlatform("Windows6.2")>
Public Sub M1()
ObsoletedOnWindows62()
End Sub
<ObsoletedOSPlatform("Windows6.2")>
Public Sub ObsoletedOnWindows62()
End Sub
隱藏警告的時機
如果您不擔心呼叫過時的 API,或知道受影響的 OS 版本永遠不會呼叫過時的 API,則隱藏此規則的警告是安全的。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA1422
// The code that's violating the rule is on this line.
#pragma warning restore CA1422
若要停用檔案、資料夾或專案的規則,請在組態檔 中將其嚴重性設定為 。 none
[*.{cs,vb}]
dotnet_diagnostic.CA1422.severity = none
若要停用此整個規則類別,請將組態檔中類別的嚴重性設定為 none
。
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Interoperability.severity = none
如需詳細資訊,請參閱 如何隱藏程式碼分析警告 。