警告 CA1417:P/Invoke 的字符串参数上的 OutAttribute

默认情况下,从 .NET 5 开始,启用 .NET 代码分析器规则 CA1417 。 它会为任何平台调用 (P/Invoke) 方法定义生成一个生成警告,该定义中 String 参数按值传递并使用 OutAttribute 进行标记。

更改描述

从 .NET 5 开始,.NET SDK 包括 .NET 源代码分析器。 默认情况下会启用其中几个规则,包括 CA1417。 如果项目包含违反此规则的代码,并且配置为将警告视为错误,则此更改可能会中断生成。

规则 CA1417 标记 P/Invoke 方法定义,其中参数 StringOutAttribute 属性标记并按值传递。 例如:

[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

  • 若要完全禁用代码分析,请在项目文件中设置为EnableNETAnalyzersfalse。 有关详细信息,请参阅 EnableNETAnalyzers

受影响的 API

无法通过 API 分析检测。