Share via


CA1417: P/Invokes에 대한 문자열 매개 변수에서 OutAttribute를 사용하지 마세요

속성
규칙 ID CA1417
타이틀 P/Invokes에 대한 문자열 매개 변수에서 OutAttribute를 사용하지 않음
범주 상호 운용성
수정 사항이 주요 변경인지 여부 주요 변경 아님
.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);

경고를 표시하지 않는 경우

이 규칙의 경고는 표시해야 합니다.

참고 항목