C#idiomatic C#
ca1417fundamentals/code-analysis/quality-rules

Code analysis

CA1417: Do not use `OutAttribute` on string parameters for P/Invokes

Learn about code analysis rule CA1417: Do not use OutAttribute on string parameters for P/Invokes

CA1417 Interoperability enabled by default in .NET 10: As warning
Fix is breaking or non-breaking Non-breakingApplicable languages C# and Visual Basic

Cause

A P/Invoke string parameter is passed by value and marked with System.Runtime.InteropServices.OutAttribute.

Rule description

The .NET runtime automatically performs string interning. If an interned string marked with System.Runtime.InteropServices.OutAttribute is passed by value to a P/Invoke, the runtime can be destabilized.

How to fix violations

If marshalling of modified string data back to the caller is required, pass the string by reference instead. Otherwise, the System.Runtime.InteropServices.OutAttribute can be removed without any other changes.

csharp
 // 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);

When to suppress warnings

It is not safe to suppress a warning from this rule.

See also