FxCop API를 사용하여 사용자 지정 FxCop (코드 분석) 규칙을 작성하고 있습니다. 내가 무엇을 달성하고자하는형식에 StructLayoutAttribute가있는 경우 fxcop에 반환하십시오.
은 다음
- 이 declaringtype 구조체로있는 필드를 찾을 수 있습니다.
- 구조체에 "StructLayoutAttribute"가 있으면 필드를 무시하십시오.
- 필드가 읽기 전용이 아닌 경우 새로운 문제를 추가하십시오.
기본 기능이 올바르게 작동하고 있습니다. 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;
확실히 확인하십시오. 전화 끊기가 무엇인지 잘 모르는 경우 유사한 예를 보려면 [이 대답] (http://stackoverflow.com/questions/8091821/fxcop-custom-rule-for-checking-assembly-info-values)을보십시오. –
이것은 내가 찾고있는 것이 아닙니다. 어셈블리 수준에서 특성이 선언되지 않았습니다. 나는 당신에게 보여줄 여분의 데이터로 내 질문을 편집 할 것이다. – Matthijs
글쎄, 분명히 좀 분명해. 따라서 module.ContainingAssembly를 사용하지 마십시오.GetAttribute(), field.DeclaringType.GetAttribute()를 사용하십시오. 구조체의 특성을 확인하려고하기 때문에. 이 작품을 만들기 위해 무엇을 시도했는지는 분명하지 않습니다. –