2014-04-10 1 views
0

FxCop API를 사용하여 사용자 지정 FxCop (코드 분석) 규칙을 작성하고 있습니다. 내가 무엇을 달성하고자하는형식에 StructLayoutAttribute가있는 경우 fxcop에 반환하십시오.

은 다음

  1. 이 declaringtype 구조체로있는 필드를 찾을 수 있습니다.
  2. 구조체에 "StructLayoutAttribute"가 있으면 필드를 무시하십시오.
  3. 필드가 읽기 전용이 아닌 경우 새로운 문제를 추가하십시오.

기본 기능이 올바르게 작동하고 있습니다. declaringtype에 StructLayoutAttribute가 있는지 확인하는 방법을 알 수 없습니다.

따라서 StructLayoutAttribute가 FxCop API에 정의되어 있지 않습니다. 그럼 어떻게 찾았 을까요?

일부 샘플 (C#을) - 코드 :

public override ProblemCollection Check(Member member) 
{ 
    Field field = member as Field; 
    if (field == null) 
     return null; 
    if (field.DeclaringType.NodeType != NodeType.Struct) 
     return null;   
    //Possibly something like: if(field.DeclaringType.Attributes ..... 
    // return null; 
    if (!field.IsInitOnly) 
    { 
     Resolution resolution = GetResolution(field, field.DeclaringType); 
     Problems.Add(new Problem(resolution)); 
    } 
    return Problems; 
} 

추가 :이 무시 받아야합니다.

[StructLayout(LayoutKind.Sequential)] 
private struct MXRecord 
{ 
    public IntPtr Next; 
    public string Name; 
    public short Type; 
    public short DataLength; 
    public int Flags; 
    public int Ttl; 
    public int Reserved; 
    public IntPtr NameExchange; 
    public short Preference; 
    public short Pad; 
} 

그리고 이렇게해서는 안됩니다.

나는 (제안) 시도 무엇
private struct MXRecord 
{ 
    public IntPtr Next; 
    public string Name; 
    public short Type; 
    public short DataLength; 
    public int Flags; 
    public int Ttl; 
    public int Reserved; 
    public IntPtr NameExchange; 
    public short Preference; 
    public short Pad; 
} 

는 다음과 같습니다 :

StructLayoutAttributeType = FrameworkAssemblies.Mscorlib.GetType(Identifier.For("System.Runtime.InteropServices"),Identifier.For("StructLayoutAttribute")); 

Field field = member as Field; 
if (field == null) 
    return null; 
if (field.DeclaringType.NodeType != NodeType.Struct) 
    return null; 
AttributeNode structLayoutAttrib = field.DeclaringType.GetAttribute(StructLayoutAttributeType); 

if (structLayoutAttrib != null) 
    return null; 
if (!field.IsInitOnly) 
{ 
    Resolution resolution = GetResolution(field, field.DeclaringType); 
    Problems.Add(new Problem(resolution)); 
} 
return Problems; 
+0

확실히 확인하십시오. 전화 끊기가 무엇인지 잘 모르는 경우 유사한 예를 보려면 [이 대답] (http://stackoverflow.com/questions/8091821/fxcop-custom-rule-for-checking-assembly-info-values)을보십시오. –

+0

이것은 내가 찾고있는 것이 아닙니다. 어셈블리 수준에서 특성이 선언되지 않았습니다. 나는 당신에게 보여줄 여분의 데이터로 내 질문을 편집 할 것이다. – Matthijs

+0

글쎄, 분명히 좀 분명해. 따라서 module.ContainingAssembly를 사용하지 마십시오.GetAttribute(), field.DeclaringType.GetAttribute()를 사용하십시오. 구조체의 특성을 확인하려고하기 때문에. 이 작품을 만들기 위해 무엇을 시도했는지는 분명하지 않습니다. –

답변

1

여기에 두 가지 문제가 있습니다. 첫 번째는 Type 속성 대신 필드의 DeclaringType 속성을 사용하는 것입니다. DeclaringType은 필드가 선언 된 유형을 나타내며 검사하려는 항목이 아닌 것 같습니다. 예를 들어,

public class Foo 
{ 
    private Bar _bar; 
} 

_barDeclaringTypeFoo이지만, 그 TypeBar입니다.

불행히도이 문제를 해결해도 큰 문제는 해결되지 않습니다. 즉, StructLayoutAttribute은 생성 된 일리노이에 사용자 지정 속성으로 실제로 포함시키지 않는 특별한 특성입니다. 컴파일 된 구조체는 항상 순차적, 명시 적 또는 자동 레이아웃으로 표시되지만 IL에서 StructLayoutAttribute을 보존하지 않고 유형 헤더를 사용하여 완료됩니다. 소스 코드에 StructLayoutAttribute이 포함되지 않은 경우 컴파일 된 구조체는 순차 레이아웃으로 표시됩니다.

궁극적으로 규칙의 의미는 실제로 존재하지 않는 레이아웃의 종류가 아니라면 IL에 대해 작성할 수 없다는 것입니다. 속성의 존재가 당신과 관련이있는 경우 소스 코드를 검사하는 도구 (예 : StyleCop)가 더 적합한 선택입니다.

+0

감사합니다. Nicole! 나는 실제로 SequentialLayout, AutoLayout 또는 ExplicitLayout 중 하나에 플래그가 추가 된 것을 보았습니다. DeclaringType을 타겟팅하는 것은 정확히 내가 조사하고 싶은 것입니다. 구조체 내부의 필드를 검사하고 싶지만 해당 구조체가 특성으로 표시되어 있으면 구조체 내의 필드가 무시되기를 원합니다. 당신이 말했듯이 실제로 속성을 발견하는 것은 불가능합니다. DeclaringType을 사용하는 것이 적절합니다. 어쨌든 정보에 다시 한번 감사드립니다! – Matthijs

관련 문제