警告 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 分析偵測。