Поделиться через


Предупреждение CA1417: OutAttribute в строковом параметре для P/Invoke

Начиная с .NET 5 правило CA1417 анализатора кода .NET включено по умолчанию. Оно создает предупреждение сборки для любого определения метода вызова неуправляемого кода (P/Invoke), в которых параметр String передается по значению и отмечается с помощью OutAttribute.

Описание изменения

Начиная с .NET 5 пакет SDK для .NET включает анализаторы исходного кода .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.