Предупреждение 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.