1. Create
a class library project in visual studio
2.
Add the references FxCopSdk.dll and Microsoft.Cci.dll. The dll location is "C:\Program Files (x86)\Microsoft Visual Studio
12.0\Team Tools\Static Analysis Tools\FxCop"
3.
Create the XML file and name it as RuleMetadata.xml
<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="My Custom FxCop Rules">
<Rule TypeName="EnforceHungarianNotation" Category="MyRules"CheckId="CR1000">
<Name>Enforce
Hungarian Notation</Name>
<Description>Checks
fields for compliance with Hungarian notation.</Description>
<Resolution>Field
{0} is not in Hungarian notation. Field name should be prefixed with '{1}'. </Resolution>
<MessageLevel Certainty="100">Warning</MessageLevel>
<FixCategories>NonBreaking</FixCategories>
<Url />
<Owner />
<Email />
</Rule>
</Rules>
4. Create
the BaseFxCopRule.cs class
Note: In below "MyCustomRules.RuleMetadata"
MyCutomRules is name space and RuleMetadata is xml file name which
we created above.
using Microsoft.FxCop.Sdk;
namespace MyCustomRules
{
internal abstract class BaseFxCopRule : BaseIntrospectionRule
{
protected BaseFxCopRule(string ruleName)
: base(ruleName, "MyCustomRules.RuleMetadata", typeof(BaseFxCopRule).Assembly){ }
}
}
5.Create a EnforceHungarianNotation.cs class which you can wright logic of custom
rules.
Here i we are wright the code for for every static variables should start
with s_ and every non static variables should start with m_
using Microsoft.FxCop.Sdk;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyCustomRules
{
internal sealed class EnforceHungarianNotation : BaseFxCopRule
{
public EnforceHungarianNotation(): base("EnforceHungarianNotation"){ }
// Only fire
on non-externally visible code elements.
public override TargetVisibilities TargetVisibility
{
get{return TargetVisibilities.NotExternallyVisible;}
}
public override ProblemCollection Check(Member member)
{
Field field =
member as Field;
if (field
== null)
{
// This rule
only applies to fields.
// Return a
null ProblemCollection so no violations are reported for this member.
return null;
}
if (field.IsStatic){ CheckFieldName(field,
s_staticFieldPrefix); }
else { CheckFieldName(field,
s_nonStaticFieldPrefix);}
// By default
the Problems collection is empty so no violations will be reported
// unless
CheckFieldName found and added a problem.
return Problems;
}
private const string s_staticFieldPrefix
= "s_";
private const string s_nonStaticFieldPrefix
= "m_";
static int a;
private void CheckFieldName(Field field, string expectedPrefix)
{
if (!field.Name.Name.StartsWith(expectedPrefix, StringComparison.Ordinal))
{
Resolution resolution
= GetResolution(
field, // Field {0}
is not in Hungarian notation.
expectedPrefix // Field name
should be prefixed with {1}.
);
Problem problem
= new Problem(resolution);
Problems.Add(problem);
}
}
}
}
6.
After completing above steps build your application. Goto Solution Explore-->right click on solution and build it.
7.
copy the dll from the bin folder to "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team
Tools\Static Analysis Tools\FxCop\Rules
"
8.
Now test the rules for same project. Now goto EnforceHungarianNotation.cs class
create a static variable
9.
run the code analysis on solution we can see the warning CR1000 which we
created.
You can run similar analysis on visual studio online but with easier installation (https://marketplace.visualstudio.com/items?itemName=alanwales.resharper-code-analysis)
ReplyDelete