ISS 개요
업데이트: 2007년 11월
ISS(In Source Suppression)는 SuppressMessage특성을 사용하여 코드 분석 위반 내용을 표시하지 않거나 무시하는 기능입니다. SuppressMessage특성은 조건부 특성으로, 컴파일할 때 CODE_ANALYSIS 컴파일 기호를 정의한 경우에만 관리 코드 어셈블리의 IL 메타데이터에 포함됩니다. C++에서는 CA_SUPPRESS_MESSAGE 매크로와 CA_GLOBAL_SUPPRESS_MESSAGE 매크로의 실행 결과가 같습니다.
디버그 빌드나 체크 인 빌드에서는 메타데이터 증가로 인해 발생할 수 있는 실행 또는 성능 오류나 ISS 메타데이터를 잘못 보낼 수 있는 가능성을 제거하도록 ISS를 사용하는 것이 좋습니다.
참고: |
---|
이러한 특성을 직접 코드로 작성할 필요는 없습니다. 자세한 내용은 방법: 메뉴 항목을 사용하여 경고 표시 안 함을 참조하십시오. |
SuppressMessage 특성
오류 목록에서 코드 분석 경고를 마우스 오른쪽 단추로 클릭하고 메시지 표시 안 함을 클릭하면 코드나 프로젝트의 전역 비표시 오류 파일에 SuppressMessage 특성이 추가됩니다.
SuppressMessage 특성은 다음과 같은 형식으로 구성됩니다.
<Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", Scope = "Scope", Target = "Target")>
[Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", Scope = "Scope", Target = "Target")]
다음은 각 항목에 대한 설명입니다.
Rule Category - 규칙이 정의된 범주입니다.
Rule Id - 규칙의 식별자입니다. 규칙 ID에는 약식 이름과 긴 이름이 모두 지원됩니다. 약식 이름은 CAXXXX이고 긴 이름은 CAXXXX:FriendlyTypeName입니다.
Justification - 메시지를 표시하지 않는 이유를 설명하는 데 사용되는 텍스트입니다.
Message Id - 각 메시지에 대한 문제를 나타내는 고유한 식별자입니다.
Scope - 경고가 표시되지 않는 대상입니다. 대상을 지정하지 않으면 특성의 대상으로 설정됩니다. 지원되는 범위는 다음과 같습니다.
모듈
네임스페이스
리소스
형식
멤버
매개 변수
Target - 경고가 표시되지 않는 대상을 지정하는 데 사용되는 식별자입니다. 정규화된 항목 이름을 포함해야 합니다.
SuppressMessage 사용
SuppressMessage 특성의 인스턴스가 적용되는 수준에서 코드 분석 경고는 표시되지 않습니다. 이 특성은 위반이 발생하는 코드에 비표시 오류 정보를 연결하기 위한 것입니다.
일반적인 형식의 비표시 오류(Suppression)에는 규칙 범주 및 규칙 이름을 읽기 쉽게 나타낸 선택적 표현이 포함된 규칙 ID가 포함됩니다. 예를 들면 다음과 같습니다.
[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]
ISS 메타데이터를 최소화해야 할 확실한 성능상의 이유가 있다면 규칙 이름은 생략할 수 있습니다. 규칙 범주와 규칙 ID만으로도 충분히 고유한 규칙 식별자가 만들어집니다. 예를 들면 다음과 같습니다.
[SuppressMessage("Microsoft.Design", "CA1039")]
유지 관리 편의성 문제로 인해 이 형식은 사용하지 않는 것이 좋습니다.
메서드 본문에서 여러 위반 표시하지 않기
특성은 메서드에만 적용할 수 있으며 메서드 본문에는 포함할 수 없습니다. 그러나 식별자를 메시지 ID로 지정하여 메서드 내에서 발생하는 여러 위반을 구별할 수 있습니다.
Imports System
Namespace InSourceSuppression
Public Class Class1
<System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
"CA1801:ReviewUnusedParameters", MessageId:="guid")> _
Shared Function IsValidGuid(ByVal guid As String) As Boolean
Try
Return True
Catch e As ArgumentNullException
Catch e As OverflowException
Catch e As FormatException
End Try
Return False
End Function
End Class
End Namespace
using System;
namespace InSourceSuppression
{
public class Class1
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
public static bool IsValidGuid(string guid)
{
try
{
new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults
return true;
}
catch (ArgumentNullException) {}
catch (OverflowException) {}
catch (FormatException) {}
return false;
}
}
}
생성된 코드
관리 코드 컴파일러와 일부 타사 도구에서는 코드 개발 속도를 향상시키기 위해 코드를 생성합니다. 컴파일러에서 생성된 코드는 소스 파일에서 보통 GenerateCodeAttribute 특성으로 표시됩니다.
생성된 코드의 코드 분석 경고 및 오류를 표시하지 않도록 선택할 수 있습니다. 이러한 경고 및 오류를 표시하지 않는 방법에 대한 자세한 내용은 관리 코드의 코드 분석 속성을 참조하십시오.
GenerateCodeAttribute를 전체 어셈블리나 하나의 매개 변수에 적용하면 코드 분석에서 이를 무시합니다. 이러한 상황은 거의 발생하지 않습니다.
전역 수준 비표시 오류
관리 코드 분석 도구에서는 어셈블리, 모듈, 형식, 멤버 또는 매개 변수 수준에서 적용되는 SuppressMessage 특성을 검사하며, 리소스와 네임스페이스에 대해 위반을 발생시킵니다. 이러한 위반은 전역 수준에서 적용해야 하며 범위와 대상을 지정해야 합니다. 예를 들어, 다음 메시지는 네임스페이스 위반을 표시하지 않습니다.
[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]
참고: |
---|
네임스페이스 범위가 지정된 경고를 표시하지 않도록 하면 네임스페이스 자체에 대한 경고는 표시되지 않습니다. 그러나 네임스페이스 내의 형식에 대한 경고는 표시됩니다. |
모든 비표시 오류는 명시적 범위를 지정하여 나타낼 수 있습니다. 이러한 비표시 오류는 전역 수준에 있어야 합니다. 형식을 데코레이팅하여 멤버 수준 비표시 오류를 지정할 수는 없습니다.
명시적으로 제공되는 사용자 소스에 매핑되지 않는 컴파일러 생성 코드 참조 메시지를 표시하지 않기 위한 유일한 방법은 전역 수준 비표시 오류를 사용하는 것입니다. 예를 들어, 다음 코드에서는 컴파일러에서 내보낸 생성자에 대한 위반을 표시하지 않습니다.
[module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]
참고: |
---|
대상에는 항상 정규화된 항목 이름이 포함됩니다. |
전역 비표시 오류 파일
전역 비표시 오류 파일에는 전역 수준 비표시 오류나 대상이 지정되지 않은 비표시 오류가 저장됩니다. 예를 들어, 어셈블리 수준 위반이 이 파일에 저장됩니다. 또한 양식에 숨겨진 코드에는 프로젝트 수준 설정을 사용할 수 없으므로 일부 ASP.NET 비표시 오류도 이 파일에 저장됩니다.