默认情况下,从 .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 分析检测。