<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.submain.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Tutorials</title><link>http://community.submain.com/blogs/tutorials/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>CodeItRight.Cmd.exe Command Line Options</title><link>http://community.submain.com/blogs/tutorials/archive/2008/03/23/codeitright-cmd-exe-command-line-parameters.aspx</link><pubDate>Mon, 24 Mar 2008 05:11:00 GMT</pubDate><guid isPermaLink="false">e6092f25-edd1-48d7-b80f-8bdb13d630d6:484</guid><dc:creator>Serge B.</dc:creator><slash:comments>3</slash:comments><comments>http://community.submain.com/blogs/tutorials/comments/484.aspx</comments><wfw:commentRss>http://community.submain.com/blogs/tutorials/commentrss.aspx?PostID=484</wfw:commentRss><wfw:comment>http://community.submain.com/blogs/tutorials/rsscomments.aspx?PostID=484</wfw:comment><description>&lt;p&gt;CodeItRight.Cmd is the command-line companion to the CodeIt.Right application. Like CodeIt.Right, CodeItRight.Cmd analyzes source code and reports violations, such as possible design, performance, and security issues. CodeItRight.Cmd can be used as a stand-alone tool or added to automated build processes.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The following are the&amp;nbsp;command line parameters&amp;nbsp;that are supported by&amp;nbsp;SubMain.CodeItRight.Cmd.exe ;&amp;nbsp;Parameter values are not case sensitive.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;/Solution&lt;/strong&gt;&amp;nbsp; - (&lt;strong&gt;Required*&lt;/strong&gt;) - full file name of the solution to load (*.sln file) (*) This parameter is not required if &lt;strong&gt;/Project&lt;/strong&gt; parameter specified.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;/Project&lt;/strong&gt;&amp;nbsp;&amp;nbsp; - (&lt;strong&gt;Required*&lt;/strong&gt;) - full file name of the&amp;nbsp;project to load (*.csproj or *.vbproj file) (*) This parameter is not required if &lt;strong&gt;/Solution&lt;/strong&gt; parameter specified.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/Out&lt;/strong&gt;&amp;nbsp; - (&lt;strong&gt;Required&lt;/strong&gt;) - full name of the xml report output file.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/OutXSL&lt;/strong&gt;&amp;nbsp; - (Optional) - full name of the xsl file to override the default xsl.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/CRData&amp;nbsp;&lt;/strong&gt; - (Optional) - full name of the CodeIt.Right .crdata file. When specified, CodeItRight.Cmd will use the exclusion list (violations, rules and files) saved using the Visual Studio version of CodeIt.Right.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/Profile&lt;/strong&gt;&amp;nbsp; - (Optional) - name of the User Profile that defines active rule set&amp;nbsp;for&amp;nbsp;the analysis.&amp;nbsp;When omitted, the buil-in profile&amp;nbsp;is used.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/Quiet&lt;/strong&gt; - (Optional) - disables console output.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;/Help&lt;/strong&gt;&amp;nbsp; -&amp;nbsp;display&amp;nbsp;list of&amp;nbsp;command line parameters.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;font face="courier new,courier"&gt;SubMain.CodeItRight.Cmd.exe /Solution:&amp;quot;C:\MyProjects\MyProject\MyProject.sln&amp;quot; &lt;br /&gt;&lt;/font&gt;&lt;font face="courier new,courier"&gt;/Out:&amp;quot;C:\MyProjects\MyProject\MyProject.CIR.Output.xml&amp;quot; &lt;br /&gt;/CRData:&amp;quot;C:\MyProjects\MyProject\MyProject.crdata&amp;quot; /Profile:&amp;quot;My Profile&amp;quot;&lt;/font&gt;&lt;/blockquote&gt;&lt;h4&gt;CodeItRight.Cmd Error Codes&lt;/h4&gt;&lt;blockquote&gt;&lt;table cellpadding="3" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt;0x0&lt;/td&gt;&lt;td&gt;No errors&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0x1&lt;/td&gt;&lt;td&gt;Command Line Switch Error&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0x2&lt;/td&gt;&lt;td&gt;Command Line Argument Error&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0x4&lt;/td&gt;&lt;td&gt;Initialization Error&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0x8&lt;/td&gt;&lt;td&gt;Analysis Error&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0x10&lt;/td&gt;&lt;td&gt;Output Error&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0x20&lt;/td&gt;&lt;td&gt;Unknown Error&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;img src="http://community.submain.com/aggbug.aspx?PostID=484" width="1" height="1"&gt;</description><category domain="http://community.submain.com/blogs/tutorials/archive/tags/CodeIt.Right/default.aspx">CodeIt.Right</category><category domain="http://community.submain.com/blogs/tutorials/archive/tags/Command+Line/default.aspx">Command Line</category><category domain="http://community.submain.com/blogs/tutorials/archive/tags/Continuous+Integration/default.aspx">Continuous Integration</category></item><item><title>Tutorial: Creating Custom Rules</title><link>http://community.submain.com/blogs/tutorials/archive/2008/03/16/tutorial-creating-custom-rules.aspx</link><pubDate>Sun, 16 Mar 2008 23:17:00 GMT</pubDate><guid isPermaLink="false">e6092f25-edd1-48d7-b80f-8bdb13d630d6:469</guid><dc:creator>Serge B.</dc:creator><slash:comments>1</slash:comments><comments>http://community.submain.com/blogs/tutorials/comments/469.aspx</comments><wfw:commentRss>http://community.submain.com/blogs/tutorials/commentrss.aspx?PostID=469</wfw:commentRss><wfw:comment>http://community.submain.com/blogs/tutorials/rsscomments.aspx?PostID=469</wfw:comment><description>&lt;p&gt;The best part about CodeIt.Right is that you are not limited to just the rule libraries included into the box. You can easily define your own (custom) rules. What makes this possible is the &amp;quot;CodeIt.Right SDK&amp;quot;. The SDK documentation is available online at &lt;a href="http://submain.com/codeit.right/sdk/"&gt;http://submain.com/codeit.right/sdk/&lt;/a&gt; as well as locally as part of your CodeIt.Right help file.&lt;/p&gt;&lt;p&gt;In this tutorial we will create &amp;quot;Use Certain Suffixes For Derived Types&amp;quot; rule. We will &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create Custom Rule Template using Wizard that CodeIt.Right adds to Visual Studio&lt;/li&gt;&lt;li&gt;Implement set of methods and properties that will find and correct violations of the rule&lt;/li&gt;&lt;li&gt;Define Configurable Properties for the rule, so the users will be able to create instances of the rule and tweak it to their needs&lt;/li&gt;&lt;li&gt;Deploy the new rule&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Create Custom Rule Template Using Wizard&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Open Visual Studio&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the menu bar, click &lt;strong&gt;File&lt;/strong&gt;, and then click &lt;strong&gt;New Project&lt;/strong&gt; &lt;p&gt;&lt;img border="0" height="197" src="http://community.submain.com/photos/tutorials/images/470/original.aspx" width="358" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;New Project&lt;/strong&gt; dialog box, in the &lt;strong&gt;Project Types&lt;/strong&gt; pane, select &lt;strong&gt;CodeIt.Right Projects&lt;/strong&gt; if that option is not already selected. &lt;p&gt;&lt;img border="0" height="495" src="http://community.submain.com/photos/tutorials/images/471/original.aspx" width="681" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;Templates&lt;/strong&gt; pane, select the template for the appropriate programming language (Visual Basic or Visual C#). The custom rule in the examples uses Visual Basic.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Complete the &lt;strong&gt;Name&lt;/strong&gt;, &lt;strong&gt;Location&lt;/strong&gt;, and &lt;strong&gt;Solution&lt;/strong&gt; fields for the custom rule. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;. The &lt;strong&gt;New Rule Wizard&lt;/strong&gt; dialog box appears.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;New Rule Wizard&lt;/strong&gt; dialog box, complete as many of the fields as possible. Fields that have a red asterisk to the right are required. Click &lt;strong&gt;Next&lt;/strong&gt;. &lt;p&gt;&lt;img border="0" height="460" src="http://community.submain.com/photos/tutorials/images/473/original.aspx" width="626" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Select the options to determine the scope for the custom rule. To select or deselect all the options, select &lt;strong&gt;All&lt;/strong&gt;. Click &lt;strong&gt;Next&lt;/strong&gt;. &lt;p&gt;&lt;img border="0" height="460" src="http://community.submain.com/photos/tutorials/images/474/original.aspx" width="626" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Select the targets for the custom rule. When done, click &lt;strong&gt;Finish&lt;/strong&gt;. &lt;p&gt;&lt;img border="0" height="460" src="http://community.submain.com/photos/tutorials/images/475/original.aspx" width="626" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The status bar at the bottom of the Visual Studio window displays the progress of the creation of the custom rule.&lt;/p&gt;&lt;h4&gt;Edit the Generated Template&lt;/h4&gt;&lt;p&gt;After a custom rule template is created, you can edit it in the &lt;strong&gt;Solution Explorer&lt;/strong&gt;. You can edit template information, the content generated by the &lt;strong&gt;New Rule Wizard&lt;/strong&gt;, and implement code of the &lt;strong&gt;Check&lt;/strong&gt; and &lt;strong&gt;Correct&lt;/strong&gt; methods.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Double-click the rule in Soultion Explorer to edit it. The generated regions of the rule are collapsed by default. &lt;p&gt;&lt;a href="http://community.submain.com/photos/tutorials/picture477.aspx" target="_blank"&gt;&lt;/a&gt;&lt;img border="0" height="389" src="http://community.submain.com/photos/tutorials/images/477/original.aspx" width="491" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Expand the &lt;strong&gt;Wizard Generated Code&lt;/strong&gt; region to review the code generated based on options selected in the &lt;strong&gt;New Rule Wizard&lt;/strong&gt;. You can edit the options&amp;nbsp;if necessary. Note that the rule&amp;#39;s ID is automatically generated GUID - you can edit it as well but &lt;em&gt;make sure your ID is not equal to any of the built-in CodeIt.Right rules&lt;/em&gt; or even better your rule ID doesn&amp;#39;t follow CodeIt.Right internal ID schema. &lt;br /&gt;&lt;br /&gt;&lt;table cellspacing="0" class="irisContainer" style="border-collapse:collapse;border-spacing:0pt;"&gt;&lt;tr&gt;&lt;td style="margin:0pt;padding:0pt;"&gt;&lt;/td&gt;&lt;td class="highlighted output" rowspan="2"&gt;&lt;pre class="vb highlighted"&gt;&lt;span class="normal"&gt;&lt;span class="type"&gt;#&lt;/span&gt;Region &lt;span class="string"&gt;&amp;quot;Wizard Generated Code&amp;quot;&lt;/span&gt;

&lt;span class="type"&gt;#&lt;/span&gt;Region &lt;span class="string"&gt;&amp;quot;Data Entered On Wizard form&amp;quot;&lt;/span&gt;

    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputID &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;0500daf7-f2a0-4549-b90e-bd8f6d515bb5&amp;quot;&lt;/span&gt;
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputName &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;UseCertainSuffixesForDerivedTypes&amp;quot;&lt;/span&gt;
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputTitle &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;Use Certain Suffixes For Derived Types&amp;quot;&lt;/span&gt;
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputSeverity &lt;span class="statement"&gt;As&lt;/span&gt; SeverityLevel &lt;span class="operator"&gt;=&lt;/span&gt; SeverityLevel&lt;span class="operator"&gt;.&lt;/span&gt;Warning
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputScopes &lt;span class="statement"&gt;As&lt;/span&gt; RuleScopes &lt;span class="operator"&gt;= _&lt;/span&gt;
      RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="statement"&gt;Public&lt;/span&gt; &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;ProtectedInternal &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Abstract &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Sealed&lt;span class="operator"&gt; _&lt;/span&gt;
      &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Readonly &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Virtual &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Override &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Extern &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Unsafe&lt;span class="operator"&gt; _&lt;/span&gt;
      &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;SpecialName &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="statement"&gt;Const&lt;/span&gt; &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Volatile &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;WriteOnly&lt;span class="operator"&gt; _&lt;/span&gt;
      &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="statement"&gt;WithEvents&lt;/span&gt; &lt;span class="operator"&gt;or&lt;/span&gt; RuleScopes&lt;span class="operator"&gt;.&lt;/span&gt;Default
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputAuthor &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;SubMain Team&amp;quot;&lt;/span&gt;
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputEmail &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;support@submain.com&amp;quot;&lt;/span&gt;
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputUrl &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputAvailableTargets &lt;span class="statement"&gt;As&lt;/span&gt; RuleTargets &lt;span class="operator"&gt;=&lt;/span&gt; RuleTargets&lt;span class="operator"&gt;.&lt;/span&gt;Class
    &lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Const&lt;/span&gt; InputViolationDescription &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="type"&gt;#&lt;/span&gt;&lt;span class="statement"&gt;End&lt;/span&gt; Region

&lt;span class="type"&gt;#&lt;/span&gt;Region &lt;span class="string"&gt;&amp;quot;Constructor&amp;quot;&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; &lt;span class="statement"&gt;Sub&lt;/span&gt; &lt;span class="statement"&gt;New&lt;/span&gt;&lt;span class="operator"&gt;()&lt;/span&gt;
        &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="statement"&gt;Name&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; InputName
        &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;Title &lt;span class="operator"&gt;=&lt;/span&gt; InputTitle
        &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;Severity &lt;span class="operator"&gt;=&lt;/span&gt; InputSeverity
        &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;Targets &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;AvailableTargets
        &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;Scopes &lt;span class="operator"&gt;=&lt;/span&gt; InputScopes
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Sub&lt;/span&gt;

&lt;span class="type"&gt;#&lt;/span&gt;&lt;span class="statement"&gt;End&lt;/span&gt; Region

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; ID &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;
        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; InputID
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; AvailableTargets &lt;span class="statement"&gt;As&lt;/span&gt; RuleTargets
        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; InputAvailableTargets
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; Author &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;
        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; InputAuthor
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; Email &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;
        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; InputEmail
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; Url &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;
        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; InputUrl
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; ViolationDescription &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;
        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; InputViolationDescription
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

    &lt;span class="statement"&gt;Public&lt;/span&gt; Overloads &lt;span class="statement"&gt;Function&lt;/span&gt; Correct&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;ByVal&lt;/span&gt; correctionOptionIndex &lt;span class="statement"&gt;as&lt;/span&gt; &lt;span class="type"&gt;Integer&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;Boolean&lt;/span&gt;
        MyBase&lt;span class="operator"&gt;.&lt;/span&gt;Correct&lt;span class="operator"&gt;(&lt;/span&gt;correctionOptionIndex&lt;span class="operator"&gt;)&lt;/span&gt;

        &lt;span class="conditional"&gt;Select&lt;/span&gt; &lt;span class="conditional"&gt;Case&lt;/span&gt; correctionOptionIndex

            &lt;span class="conditional"&gt;Case&lt;/span&gt; &lt;span class="conditional"&gt;Else&lt;/span&gt;
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;Select&lt;/span&gt;

        &lt;span class="statement"&gt;Return&lt;/span&gt; &lt;span class="boolean"&gt;False&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Function&lt;/span&gt;

&lt;span class="type"&gt;#&lt;/span&gt;&lt;span class="statement"&gt;End&lt;/span&gt; Region
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="output lineNumbers"&gt;&lt;pre class="lineNumbers"&gt;&lt;span class="lineNumbers"&gt;1
2
3
4
5
6
7
8
9
&lt;span class="nthLineNumber"&gt;10&lt;/span&gt;
11
12
13
14
15
16
17
18
19
&lt;span class="nthLineNumber"&gt;20&lt;/span&gt;
21
22
23
24
25
26
27
28
29
&lt;span class="nthLineNumber"&gt;30&lt;/span&gt;
31
32
33
34
35
36
37
38
39
&lt;span class="nthLineNumber"&gt;40&lt;/span&gt;
41
42
43
44
45
46
47
48
49
&lt;span class="nthLineNumber"&gt;50&lt;/span&gt;
51
52
53
54
55
56
57
58
59
&lt;span class="nthLineNumber"&gt;60&lt;/span&gt;
61
62
63
64
65
66
67
68
69
&lt;span class="nthLineNumber"&gt;70&lt;/span&gt;
71
72
73
74
75
76
77
78
79
&lt;span class="nthLineNumber"&gt;80&lt;/span&gt;
81
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;Template to be populated by rule author&lt;/strong&gt; region, edit the &lt;strong&gt;AutoCorrectionOptions&lt;/strong&gt; property to establish all the options for automatic correction of violations to the rule. Each option is added to the drop-down list in the &lt;strong&gt;Action&lt;/strong&gt; column when code is analyzed. The &lt;strong&gt;GetCorrect0Name&lt;/strong&gt; will be implemented in the next bullet. &lt;br /&gt;&lt;br /&gt;&lt;table cellspacing="0" class="irisContainer" style="border-collapse:collapse;border-spacing:0;"&gt;&lt;tr&gt;&lt;td style="margin:0px;padding:0px;"&gt;&lt;/td&gt;&lt;td class="highlighted output" rowspan="2"&gt;&lt;pre class="vb highlighted"&gt;&lt;span class="normal"&gt;&lt;span class="statement"&gt;Public&lt;/span&gt; Overrides ReadOnly &lt;span class="statement"&gt;Property&lt;/span&gt; AutoCorrectionOptions &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;&lt;span class="operator"&gt;()&lt;/span&gt;

    &lt;span class="statement"&gt;Get&lt;/span&gt;

        &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(&lt;/span&gt;MyBase&lt;span class="operator"&gt;.&lt;/span&gt;_userCorrectOptions&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="preProc"&gt;Count&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

           &lt;span class="comment"&gt; &amp;#39; Get title of the correction option&lt;/span&gt;
            &lt;span class="statement"&gt;Dim&lt;/span&gt; text &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;GetCorrect0Name

            &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(&lt;/span&gt;[text]&lt;span class="operator"&gt;.&lt;/span&gt;Length &lt;span class="operator"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

               &lt;span class="comment"&gt; &amp;#39; Add to the list of available options&lt;/span&gt;
                MyBase&lt;span class="operator"&gt;.&lt;/span&gt;_userCorrectOptions&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="preProc"&gt;Add&lt;/span&gt;&lt;span class="operator"&gt;(&lt;/span&gt;[text]&lt;span class="operator"&gt;)&lt;/span&gt;

            &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

        &lt;span class="statement"&gt;Return&lt;/span&gt; MyBase&lt;span class="operator"&gt;.&lt;/span&gt;AutoCorrectionOptions

    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;

&lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="output lineNumbers"&gt;&lt;pre class="lineNumbers"&gt;&lt;span class="lineNumbers"&gt;1
2
3
4
5
6
7
8
9
&lt;span class="nthLineNumber"&gt;10&lt;/span&gt;
11
12
13
14
15
16
17
18
19
&lt;span class="nthLineNumber"&gt;20&lt;/span&gt;
21
22
23
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;Template to be populated by rule author&lt;/strong&gt; region, edit the &lt;strong&gt;Correction&lt;/strong&gt;&amp;nbsp;method to establish how violations to the rule are corrected. In the example below, the correct suffix is added to the code element. The new name is then checked using helper function &lt;a href="http://submain.com/codeit.right/sdk/SubMain.CodeItRight.Sdk.Utils.NamingRuleUtilities.FixForUniqueName.html"&gt;NamingRuleUtilities.FixForUniqueName&lt;/a&gt; to make sure it is unique in the solution. If not, the name is further modified so that it is unique. &lt;strong&gt;SuffixToCheck&lt;/strong&gt; is a configurable property that we will define later in this tutorial. &lt;br /&gt;&lt;br /&gt;&lt;table cellspacing="0" class="irisContainer" style="border-collapse:collapse;border-spacing:0;"&gt;&lt;tr&gt;&lt;td style="margin:0px;padding:0px;"&gt;&lt;/td&gt;&lt;td class="highlighted output" rowspan="2"&gt;&lt;pre class="vb highlighted"&gt;&lt;span class="normal"&gt;&lt;span class="statement"&gt;Private&lt;/span&gt; &lt;span class="statement"&gt;Function&lt;/span&gt; GetCorrect0Name&lt;span class="operator"&gt;()&lt;/span&gt; &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;

    &lt;span class="statement"&gt;Dim&lt;/span&gt; baseName &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="type"&gt;Empty&lt;/span&gt;

    &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(Not&lt;/span&gt; MyBase&lt;span class="operator"&gt;.&lt;/span&gt;Element &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

        &lt;span class="statement"&gt;Dim&lt;/span&gt; info &lt;span class="statement"&gt;As&lt;/span&gt; ICodeElementInfo &lt;span class="operator"&gt;=&lt;/span&gt; MyBase&lt;span class="operator"&gt;.&lt;/span&gt;Element&lt;span class="operator"&gt;.&lt;/span&gt;ToCodeElementInfo

        &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(Not&lt;/span&gt; info &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

           &lt;span class="comment"&gt; &amp;#39; Get the code element name&lt;/span&gt;
            &lt;span class="statement"&gt;Dim&lt;/span&gt; displayName &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; info&lt;span class="operator"&gt;.&lt;/span&gt;DisplayName

           &lt;span class="comment"&gt; &amp;#39; Add the correct suffix&lt;/span&gt;
            &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;((Not&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;SuffixToCheck &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; AndAlso &lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;SuffixToCheck&lt;span class="operator"&gt;.&lt;/span&gt;Length &lt;span class="operator"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="operator"&gt;))&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;
                baseName &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="operator"&gt;(&lt;/span&gt;displayName &lt;span class="operator"&gt;&amp;amp;&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;SuffixToCheck&lt;span class="operator"&gt;)&lt;/span&gt;
            &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;
    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

   &lt;span class="comment"&gt; &amp;#39; Make sure the new name is unique&lt;/span&gt;
    &lt;span class="statement"&gt;Return&lt;/span&gt; NamingRuleUtilities&lt;span class="operator"&gt;.&lt;/span&gt;FixForUniqueName&lt;span class="operator"&gt;(&lt;/span&gt;baseName&lt;span class="operator"&gt;,&lt;/span&gt; MyBase&lt;span class="operator"&gt;.&lt;/span&gt;Element&lt;span class="operator"&gt;)&lt;/span&gt;

&lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Function&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="output lineNumbers"&gt;&lt;pre class="lineNumbers"&gt;&lt;span class="lineNumbers"&gt;1
2
3
4
5
6
7
8
9
&lt;span class="nthLineNumber"&gt;10&lt;/span&gt;
11
12
13
14
15
16
17
18
19
&lt;span class="nthLineNumber"&gt;20&lt;/span&gt;
21
22
23
24
25
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In the &lt;strong&gt;Template to be populated by rule author&lt;/strong&gt; region, edit the &lt;strong&gt;Check&lt;/strong&gt;&amp;nbsp;method to establish violations to the rule are found. In the example below, each appropriate code element is checked for the correct suffix. If the element does not include the correct suffix, it is flagged as a violation. &lt;strong&gt;MustImplement&lt;/strong&gt; is another configurable property defined later in the tutorial. Method &lt;a href="http://submain.com/codeit.right/sdk/SubMain.CodeItRight.Sdk.Core.Reflection.ITypeInfo.IsAssignableFrom.html"&gt;ITypeInfo.IsAssignableFrom&lt;/a&gt; returns True if the code element derived from the type stored in MustImplement. Helper function &lt;a href="http://submain.com/codeit.right/sdk/SubMain.CodeItRight.Sdk.Utils.NamingRuleUtilities.HasSuffix.html"&gt;NamingRuleUtilities.HasSuffix&lt;/a&gt; returns True is code element has the suffix, False otherwise. &lt;br /&gt;&lt;br /&gt;&lt;table cellspacing="0" class="irisContainer" style="border-collapse:collapse;border-spacing:0;"&gt;&lt;tr&gt;&lt;td style="margin:0px;padding:0px;"&gt;&lt;/td&gt;&lt;td class="highlighted output" rowspan="2"&gt;&lt;pre class="vb highlighted"&gt;&lt;span class="normal"&gt;&lt;span class="statement"&gt;Public&lt;/span&gt; Overrides &lt;span class="statement"&gt;Function&lt;/span&gt; Check&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;ByVal&lt;/span&gt; element &lt;span class="statement"&gt;As&lt;/span&gt; IElementInfo&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;Boolean&lt;/span&gt;

    &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(Not&lt;/span&gt; element &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

        &lt;span class="statement"&gt;Dim&lt;/span&gt; info &lt;span class="statement"&gt;As&lt;/span&gt; ICodeElementInfo &lt;span class="operator"&gt;=&lt;/span&gt; element&lt;span class="operator"&gt;.&lt;/span&gt;ToCodeElementInfo

        &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(Not&lt;/span&gt; info &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

           &lt;span class="comment"&gt; &amp;#39; Get the code element name&lt;/span&gt;
            &lt;span class="statement"&gt;Dim&lt;/span&gt; displayName &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt; &lt;span class="operator"&gt;=&lt;/span&gt; info&lt;span class="operator"&gt;.&lt;/span&gt;DisplayName

           &lt;span class="comment"&gt; &amp;#39; If configurable properties SuffixToCheck and MustImplement have values&lt;/span&gt;
            &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(((Not&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;SuffixToCheck &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; AndAlso &lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;SuffixToCheck&lt;span class="operator"&gt;.&lt;/span&gt;Length &lt;span class="operator"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="operator"&gt;)) _&lt;/span&gt;
               AndAlso &lt;span class="operator"&gt;((Not&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;MustImplement &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; AndAlso &lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;MustImplement&lt;span class="operator"&gt;.&lt;/span&gt;Length &lt;span class="operator"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="operator"&gt;)))&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

                &lt;span class="statement"&gt;Dim&lt;/span&gt; info2 &lt;span class="statement"&gt;As&lt;/span&gt; ITypeInfo &lt;span class="operator"&gt;=&lt;/span&gt; TryCast&lt;span class="operator"&gt;(&lt;/span&gt;info&lt;span class="operator"&gt;,&lt;/span&gt; ITypeInfo&lt;span class="operator"&gt;)&lt;/span&gt;

               &lt;span class="comment"&gt; &amp;#39; If element derives from the type (MustImplement) and doesn&amp;#39;t have correct suffix (SuffixToCheck)&lt;/span&gt;
                &lt;span class="conditional"&gt;If&lt;/span&gt; &lt;span class="operator"&gt;(((Not&lt;/span&gt; info2 &lt;span class="statement"&gt;Is&lt;/span&gt; &lt;span class="statement"&gt;Nothing&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt; AndAlso info2&lt;span class="operator"&gt;.&lt;/span&gt;IsAssignableFrom&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;MustImplement&lt;span class="operator"&gt;)) _&lt;/span&gt;
                   AndAlso &lt;span class="operator"&gt;Not&lt;/span&gt; NamingRuleUtilities&lt;span class="operator"&gt;.&lt;/span&gt;HasSuffix&lt;span class="operator"&gt;(&lt;/span&gt;displayName&lt;span class="operator"&gt;,&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;SuffixToCheck&lt;span class="operator"&gt;))&lt;/span&gt; &lt;span class="conditional"&gt;Then&lt;/span&gt;

                   &lt;span class="comment"&gt; &amp;#39; Flag the violation&lt;/span&gt;
                    &lt;span class="statement"&gt;Return&lt;/span&gt; &lt;span class="boolean"&gt;True&lt;/span&gt;

                &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

            &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="conditional"&gt;If&lt;/span&gt;

    &lt;span class="statement"&gt;Return&lt;/span&gt; &lt;span class="boolean"&gt;False&lt;/span&gt;

&lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Function&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="output lineNumbers"&gt;&lt;pre class="lineNumbers"&gt;&lt;span class="lineNumbers"&gt;1
2
3
4
5
6
7
8
9
&lt;span class="nthLineNumber"&gt;10&lt;/span&gt;
11
12
13
14
15
16
17
18
19
&lt;span class="nthLineNumber"&gt;20&lt;/span&gt;
21
22
23
24
25
26
27
28
29
&lt;span class="nthLineNumber"&gt;30&lt;/span&gt;
31
32
33
34
35
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Configurable Properties&lt;/h4&gt;&lt;p&gt;Configurable Properties are flexible mechanism that allows to develop rules that can be customized in user profiles (rule instances). They&amp;nbsp;must be&amp;nbsp;marked with attribute &lt;strong&gt;&amp;lt;ConfigurableProperty&amp;gt;&lt;/strong&gt;. &lt;/p&gt;&lt;p&gt;For our rule we need two configurable properties - &lt;/p&gt;&lt;ul&gt;&lt;li&gt;MustImplement - will filter and only run the rest of the rule against code elements that derive from the type assigned in this property&lt;/li&gt;&lt;li&gt;SuffixToCheck - will allow to define for each rule instance suffix to be that the code element derived from MustImplement should have&lt;/li&gt;&lt;br /&gt;&lt;table cellspacing="0" class="irisContainer" style="border-collapse:collapse;border-spacing:0;"&gt;&lt;tr&gt;&lt;td style="margin:0px;padding:0px;"&gt;&lt;/td&gt;&lt;td class="highlighted output" rowspan="2"&gt;&lt;pre class="vb highlighted"&gt;&lt;span class="normal"&gt;&lt;span class="operator"&gt;&amp;lt;&lt;/span&gt;ConfigurableProperty&lt;span class="operator"&gt;,&lt;/span&gt; Description&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;Type should implement the specified type or interface&amp;quot;&lt;/span&gt;&lt;span class="operator"&gt;)&amp;gt; _&lt;/span&gt;
    &lt;span class="statement"&gt;Public&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt; MustImplement &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;

        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;_mustImplement
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;

        &lt;span class="statement"&gt;Set&lt;/span&gt;&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;ByVal&lt;/span&gt; &lt;span class="preProc"&gt;value&lt;/span&gt; &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt;
            &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;_mustImplement &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="preProc"&gt;value&lt;/span&gt;
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Set&lt;/span&gt;

    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;

&lt;span class="operator"&gt;&amp;lt;&lt;/span&gt;ConfigurableProperty&lt;span class="operator"&gt;,&lt;/span&gt; Description&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;Certain Suffix to be checked&amp;quot;&lt;/span&gt;&lt;span class="operator"&gt;)&amp;gt; _&lt;/span&gt;
    &lt;span class="statement"&gt;Public&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt; SuffixToCheck &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;

        &lt;span class="statement"&gt;Get&lt;/span&gt;
            &lt;span class="statement"&gt;Return&lt;/span&gt; &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;_suffixToCheck
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Get&lt;/span&gt;

        &lt;span class="statement"&gt;Set&lt;/span&gt;&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="statement"&gt;ByVal&lt;/span&gt; &lt;span class="preProc"&gt;value&lt;/span&gt; &lt;span class="statement"&gt;As&lt;/span&gt; &lt;span class="type"&gt;String&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt;
            &lt;span class="statement"&gt;Me&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;_suffixToCheck &lt;span class="operator"&gt;=&lt;/span&gt; &lt;span class="preProc"&gt;value&lt;/span&gt;
        &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Set&lt;/span&gt;

    &lt;span class="statement"&gt;End&lt;/span&gt; &lt;span class="statement"&gt;Property&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="output lineNumbers"&gt;&lt;pre class="lineNumbers"&gt;&lt;span class="lineNumbers"&gt;1
2
3
4
5
6
7
8
9
&lt;span class="nthLineNumber"&gt;10&lt;/span&gt;
11
12
13
14
15
16
17
18
19
&lt;span class="nthLineNumber"&gt;20&lt;/span&gt;
21
22
23
24
25
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;Here is how properties are configured for a specific instance of the rule we developed&amp;nbsp;in this tutorial&amp;nbsp;- &amp;quot;Exception class name must have &amp;#39;Exception&amp;#39; suffix&amp;quot; (click the image for full size):&lt;/p&gt;&lt;p style="margin-left:40px;"&gt;&lt;a href="http://community.submain.com/photos/tutorials/images/479/original.aspx" target="_blank"&gt;&lt;img border="0" height="375" src="http://community.submain.com/photos/tutorials/images/479/434x375.aspx" width="434" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;Adding another rule to the same project&lt;/h4&gt;&lt;p&gt;At this point of the tutorial we have one custom rule implemented in the project (library). If you want to add another rule or more to the library, you need to right-click project in the &lt;strong&gt;Solution Explorer&lt;/strong&gt;, select &lt;strong&gt;Add New Item&lt;/strong&gt; and pick &lt;strong&gt;Custom Rule Class&lt;/strong&gt; under &lt;strong&gt;CodeIt.Right Items&lt;/strong&gt; - this will start &lt;strong&gt;New Rule Wizard&lt;/strong&gt;.&lt;/p&gt;&lt;p style="margin-left:40px;"&gt;&lt;img border="0" height="419" src="http://community.submain.com/photos/tutorials/images/472/original.aspx" width="681" /&gt;&lt;/p&gt;&lt;h4&gt;Build and Deploy new rule&lt;/h4&gt;&lt;p&gt;Our rule is now ready to be deployed.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Build your custom rule project&lt;/li&gt;&lt;li&gt;Copy the resulting .dll assembly into the &lt;em&gt;&amp;lt;CodeIt.Right installation&amp;gt;\Rules&lt;/em&gt; directory (typically &lt;em&gt;Program Files\SubMain\CodeIt.Right\Rules&lt;/em&gt;)&lt;/li&gt;&lt;li&gt;Add a new instance of the new rule to your user profile. See &lt;a href="http://community.submain.com/blogs/howto/archive/2008/01/24/how-to-add-rule-to-user-profile.aspx"&gt;How to add rule to User Profile&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You &lt;em&gt;don&amp;#39;t need&lt;/em&gt; to close Visual Studio when you deploy new or updated rule library. CodeIt.Right picks up the rule library changes every time you analyze code or open Profile Editor.&lt;/p&gt;&lt;h4&gt;Where do I find samples?&lt;/h4&gt;&lt;p&gt;Your&amp;nbsp;best source for rule examples is CodeIt.Right&amp;#39;s own rule library (see the &lt;em&gt;&amp;lt;CodeIt.Right installation&amp;gt;\Rules&lt;/em&gt; directory). As of this post we have implemented 75+ rule classes with 100+ rule instances in the detault profile.&amp;nbsp;Feel free to explore what we&amp;#39;ve got using Lutz Roeder&amp;#39;s&amp;nbsp;wonderful &lt;a href="http://www.aisto.com/roeder/dotnet"&gt;Reflector&lt;/a&gt; and learn what&amp;#39;s inside of each rule.&lt;/p&gt;&lt;p&gt;Keep an eye on&amp;nbsp;is our community &lt;a href="http://community.submain.com/files/11/default.aspx"&gt;Custom Rule Repository&lt;/a&gt; - it will grow as users develop and share their rules. This is also the place where we post our complete sample rule projects.&lt;/p&gt;&lt;h4&gt;Further Reading and Resources&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://submain.com/codeit.right/sdk/"&gt;CodeIt.Right SDK Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.submain.com/content/tutorials.aspx"&gt;CodeIt.Right Tutorials&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.submain.com/blogs/howto/archive/2008/01/24/how-to-create-own-profile.aspx"&gt;How to create own Profile&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.submain.com/blogs/howto/archive/2008/01/24/how-to-add-rule-to-user-profile.aspx"&gt;How to add rule to User Profile&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Defining ViolationDescription and CorrectionDescription&amp;nbsp;properties (to be published)&lt;/li&gt;&lt;li&gt;&lt;a href="http://submain.com/codeit.right/sdk/#helper"&gt;Built-in API helper functions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.submain.com/files/11/default.aspx"&gt;Custom Rule Repository&lt;/a&gt; &lt;/li&gt;&lt;li&gt;FxCop rule mapping (to be published)&lt;/li&gt;&lt;li&gt;Using SuppressMessage Attribute (to be published)&lt;/li&gt;&lt;li&gt;Top 10 most useful API helper functions&amp;nbsp;explained (to be published)&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://community.submain.com/aggbug.aspx?PostID=469" width="1" height="1"&gt;</description><category domain="http://community.submain.com/blogs/tutorials/archive/tags/SDK/default.aspx">SDK</category><category domain="http://community.submain.com/blogs/tutorials/archive/tags/Custom+Rules/default.aspx">Custom Rules</category><category domain="http://community.submain.com/blogs/tutorials/archive/tags/Tutorial/default.aspx">Tutorial</category><category domain="http://community.submain.com/blogs/tutorials/archive/tags/CodeIt.Right/default.aspx">CodeIt.Right</category></item></channel></rss>