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);
경고를 표시하지 않는 경우
이 규칙의 경고는 표시해야 합니다.
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET