警告 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 分析检测到。