CA1417: не используйте OutAttribute
в параметрах строки для вызовов P/Invoke
Свойство | Значение |
---|---|
Идентификатор правила | CA1417 |
Заголовок | Не используйте OutAttribute в параметрах строки для P/Invokes |
Категория | Совместимость |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предупреждение |
Причина
Строковый параметр строки P/Invoke передается по значению и помечается атрибутом OutAttribute.
Описание правила
Среда выполнения .NET автоматически выполняет интернирование строк. Если интернированная строка, помеченная OutAttribute, передается по значению в метод P/Invoke, это может дестабилизировать среду выполнения.
Устранение нарушений
Если маршалирование измененных строковых данных обратно вызывающей стороне требуется, передайте строку по ссылке. В противном случае OutAttribute можно удалить без любых других изменений.
// Violation
[DllImport("MyLibrary")]
private static extern void Foo([Out] string s);
// Fixed: passed by reference
[DllImport("MyLibrary")]
private static extern void Foo(out string s);
// Fixed: marshalling data back to caller is not required
[DllImport("MyLibrary")]
private static extern void Foo(string s);
Когда лучше отключить предупреждения
Отключать предупреждения из этого правила небезопасно.
См. также
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.