CA1417: не используйте OutAttribute в параметрах строки для вызовов P/Invoke

Свойство Значение
Идентификатор правила CA1417
Заголовок Не используйте OutAttribute в параметрах строки для P/Invokes
Категория Совместимость
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предупреждение

Причина

Строковый параметр строки 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);

Когда лучше отключить предупреждения

Отключать предупреждения из этого правила небезопасно.

См. также