警告 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 分析检测到。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈