다음을 통해 공유


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

속성
규칙 ID CA1417
제목 P/Invokes에 대한 문자열 매개 변수에서 OutAttribute를 사용하지 않음
범주 상호 운용성
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 경고로서
적용 가능한 언어 C# 및 Visual Basic

원인

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

경고를 표시하지 않는 경우

이 규칙의 경고를 억제하는 것은 안전하지 않습니다.

참고하기