CA1422:驗證平臺相容性 - 過時的 API
值 | |
---|---|
規則識別碼 | CA1422 |
類別 | 互通性 |
修正是中斷或非中斷 | 非中斷 |
原因
標示為 的 ObsoletedOSPlatformAttribute API 是從標示為支援已淘汰作業系統的呼叫月臺呼叫, (OS) 。 此規則類似于 CA1416:驗證平臺相容性 ,不同之處在于它會警告指定平臺上已過時的 API,而不是完全不支援的 API。
規則描述
不建議從該 OS (版本) 連線的呼叫月臺呼叫已過時的指定 OS (版本) API。 請考慮改為呼叫非過時的 API,或防止在受影響的作業系統上呼叫過時的 API。
如何修正違規
有各種方法可修正此規則的違規:
- 將呼叫月臺限制為未包含已過時版本的作業系統,方法是使用 UnsupportedOSPlatformAttribute 或 ObsoletedOSPlatformAttribute 標記。
- 使用 System.OperatingSystem API 保護呼叫,例如
if (!OperatingSystem.IsLinux())
。 - 使用以 或否定 SupportedOSPlatformGuardAttribute 標注的 API 來 UnsupportedOSPlatformGuardAttribute 保護呼叫。
範例
下列程式碼片段顯示 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,或您知道已過時的 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
如需詳細資訊,請參閱 如何隱藏程式碼分析警告。