Share via


警告 CA1417:P/Invoke 字串參數上的 OutAttribute

從 .NET 5 開始,依預設會啟用 .NET 程式碼分析器規則 CA1417。 其會針對任何 平台叫用 (P/Invoke) 方法定義產生建置警告,其中 String 參數是由值傳遞並標記有 OutAttribute

變更描述

從 .NET 5 開始,.NET SDK 包含 .NET 原始程式碼分析器。 這些規則中有些會預設啟用,包括 CA1417。 如果您的專案包含違反此規則的程式碼,且設定為將警告視為錯誤,則此項變更會中斷您的組建。

規則 CA1417 會將 P/Invoke 方法定義加上旗標,其中 String 參數標記有 OutAttribute 屬性且由值傳遞。 例如:

[DllImport("MyLibrary")]
private static extern void PIMethod([Out] string s);

.NET 執行階段會維護稱為保留集區的資料表,其中包含程式中每一個唯一常值字串的單一參考。 如果以 OutAttribute 標記的保留字串由值傳遞至 P/Invoke 方法,執行階段可能會不穩定。 如需字串暫留的詳細資訊,請參閱 String.Intern(String) 的備註。

導入的版本

5.0

  • 如果您需要將修改過的字串資料封送處理回呼叫者,請改為藉傳址方式傳遞字串。

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • 如果您不需要將修改過的字串資料封送處理回呼叫者,只要移除 OutAttribute 即可。

    [DllImport("MyLibrary")]
    private static extern void PIMethod(string s);
    

    如需詳細資訊,請參閱 CA1417

  • 若要完全停用程式碼分析,請在專案檔中將 EnableNETAnalyzers 設定為 false。 如需詳細資訊,請參閱 EnableNETAnalyzers

受影響的 API

無法透過 API 分析偵測。