Click here to Skip to main content
15,895,667 members
Articles / Programming Languages / C#

Task Plug-in: A Flexible .NET Plug-in Architecture

Rate me:
Please Sign up or sign in to vote.
4.75/5 (17 votes)
12 Jun 20076 min read 103.4K   2.6K   159  
The Task Plug-in library is a set of classes, interfaces, enumerations and attributes that collectively support the ITaskPlugin interface. The ITaskPlugin interface is a .NET interface created to demonstrate how to create a “Plug-in” architecture utilizing the Microsoft .NET Framework.
<?xml version="1.0" encoding="utf-8"?>
<!--
=====================================================================
Stages: 
    {dev, [sit,] uat, prod, default, auto}

"dev"  : Development
"sit"  : System Integration Test
"uat"  : User Acceptance Testing
"prod" : Production

"default": 
    This section is read first regardless of what stage 
    is specified. Then, if a different stage has been specified,
    that stage's section is read and allowed to overwrite the 
    values from the default section.

"auto":
    The value "auto" signals that the hosts section should be read
    to determine the current stage. This stage value should only be
    applied to the application.settings element, not to a stage element.
    
Other stages can be defined as needed.
=====================================================================
-->

<application.settings>

  <!-- =============== HOSTS: Map machine name to stage. =============== -->
  <hosts>
    <!-- New developers will need to add a host entry for their PC here: -->
    <!-- 
    <host name="<INSERT DEV PC NAME HERE>" stage="dev" comment="Home" />
    <host name="<INSERT PROD PC NAME HERE>" stage="prod" comment="Joe"/>
    -->
  </hosts>

  <!-- 
    Default Stage: 
    These values are read first, then optionally overwritten by values from specific stage .
  -->
  <stage name="default">
    <setting key="Schedule">

      <!-- 
         <ScheduledTime Base="" Offset="" />
         <SimpleInterval StartTime="" Interval="" EndTime=""/>
         <SimpleInterval StartTime="" Interval="" />
         <SimpleInterval StartTime="" Interval="" Count=""/>
         <SingleEvent EventTime="" />
         <EventQueue></EventQueue>
         <BlockWrapper Base="" BeginOffset="" EndOffset=""> </BlockWrapper>
         -->
      <Schedule>
        <ScheduledTime Base="ByMinute" Offset="2,0" />
        <SimpleInterval StartTime="1/7/08" Interval="5" EndTime="1/15/08"/>
        <SimpleInterval StartTime="1/1/08" Interval="15" />
        <SimpleInterval StartTime="1/2/08" Interval="20" Count="5"/>
        <SingleEvent EventTime="1/15/08" />
        <EventQueue>
          <ScheduledTime Base="ByMinute" Offset="15,0" />
          <ScheduledTime Base="ByMinute" Offset="30,0" />
        </EventQueue>
        <BlockWrapper Base="Daily" BeginOffset="6:00 AM" EndOffset="5:00 PM">
          <ScheduledTime Base="ByMinute" Offset="15,0" />
        </BlockWrapper>
      </Schedule>

    </setting>
    <setting key="log4net">
      <log4net>
        <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="telnetAppender" type="log4net.Appender.TelnetAppender,log4net">
          <threshold value="ALL"/>
          <param name="port" value="7001"/>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        
        <appender name="rollingFile2" type="log4net.Appender.RollingFileAppender,log4net">
          <threshold value="ALL"/>
          <param name="File" value="logs/PluginShellPlugin"/>
          <param name="AppendToFile" value="true"/>
          <param name="RollingStyle" value="Date"/>
          <param name="DatePattern" value=".yyyy.MM.dd.'txt'"/>
          <param name="StaticLogFileName" value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
        </appender>
        <root>
          <level value="ALL"/>
          <appender-ref ref="rollingFile2"/>
          <appender-ref ref="telnetAppender"/>
        </root>
      </log4net>
    </setting>
  </stage>

  <!-- =============== DEVELOPMENT =============== -->
  <stage name="dev">
    <setting key="log4net">
      <log4net>
        <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="telnetAppender" type="log4net.Appender.TelnetAppender,log4net">
          <threshold value="ALL"/>
          <param name="port" value="7001"/>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="consoleDebug" type="log4net.Appender.ColoredConsoleAppender, log4net">
          <threshold value="ALL"/>
          <mapping>
            <level value="DEBUG"/>
            <foreColor value="Green, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="WARN"/>
            <foreColor value="White, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="INFO"/>
            <foreColor value="Yellow, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="ERROR"/>
            <foreColor value="Red, HighIntensity"/>
          </mapping>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
          <threshold value="ALL"/>
          <param name="File" value="logs/PluginShellPlugin"/>
          <param name="AppendToFile" value="true"/>
          <param name="RollingStyle" value="Date"/>
          <param name="DatePattern" value=".yyyy.MM.dd.'txt'"/>
          <param name="StaticLogFileName" value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
        </appender>
        <root>
          <level value="ALL"/>
          <appender-ref ref="consoleDebug"/>
          <appender-ref ref="rollingFile"/>
          <appender-ref ref="telnetAppender"/>
        </root>
      </log4net>
    </setting>
  </stage>

  <!-- =============== SIT: SYSTEM INTEGRATION TEST =============== -->
  <stage name="sit">
    <setting key="log4net">
      <log4net>
        <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="telnetAppender" type="log4net.Appender.TelnetAppender,log4net">
          <threshold value="ALL"/>
          <param name="port" value="7001"/>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="consoleDebug" type="log4net.Appender.ColoredConsoleAppender, log4net">
          <threshold value="ALL"/>
          <mapping>
            <level value="DEBUG"/>
            <foreColor value="Green, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="WARN"/>
            <foreColor value="White, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="INFO"/>
            <foreColor value="Yellow, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="ERROR"/>
            <foreColor value="Red, HighIntensity"/>
          </mapping>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
          <threshold value="ALL"/>
          <param name="File" value="logs/PluginShellPlugin"/>
          <param name="AppendToFile" value="true"/>
          <param name="RollingStyle" value="Date"/>
          <param name="DatePattern" value=".yyyy.MM.dd.'txt'"/>
          <param name="StaticLogFileName" value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
        </appender>
        <root>
          <level value="ALL"/>
          <appender-ref ref="consoleDebug"/>
          <appender-ref ref="rollingFile"/>
          <appender-ref ref="telnetAppender"/>
        </root>
      </log4net>
    </setting>
  </stage>

  <!-- =============== UAT: USER ACCEPTANCE TEST =============== -->
  <stage name="uat">
    <setting key="log4net">
      <log4net>
        <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="telnetAppender" type="log4net.Appender.TelnetAppender,log4net">
          <threshold value="ALL"/>
          <param name="port" value="7001"/>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="consoleDebug" type="log4net.Appender.ColoredConsoleAppender, log4net">
          <threshold value="ALL"/>
          <mapping>
            <level value="DEBUG"/>
            <foreColor value="Green, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="WARN"/>
            <foreColor value="White, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="INFO"/>
            <foreColor value="Yellow, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="ERROR"/>
            <foreColor value="Red, HighIntensity"/>
          </mapping>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
          <threshold value="ALL"/>
          <param name="File" value="logs/PluginShellPlugin"/>
          <param name="AppendToFile" value="true"/>
          <param name="RollingStyle" value="Date"/>
          <param name="DatePattern" value=".yyyy.MM.dd.'txt'"/>
          <param name="StaticLogFileName" value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
        </appender>
        <appender name="smtp" type="log4net.Appender.SmtpAppender, log4net">
          <threshold value="ERROR"/>
          <to value="blah@blah.com"/>
          <from value="blah@blah.com"/>
          <subject value="Plugin Shell (UAT) Error Message"/>
          <smtpHost value="localhost"/>
          <bufferSize value="1"/>
          <lossy value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <root>
          <level value="DEBUG"/>
          <appender-ref ref="consoleDebug"/>
          <appender-ref ref="rollingFile"/>
          <appender-ref ref="telnetAppender"/>
          <appender-ref ref="smtp"/>
        </root>
      </log4net>
    </setting>
  </stage>

  <!-- =============== PRODUCTION =============== -->
  <stage name="prod">
    <setting key="log4net">
      <log4net>
        <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="telnetAppender" type="log4net.Appender.TelnetAppender,log4net">
          <threshold value="ALL"/>
          <param name="port" value="7001"/>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="consoleDebug" type="log4net.Appender.ColoredConsoleAppender, log4net">
          <threshold value="ALL"/>
          <mapping>
            <level value="DEBUG"/>
            <foreColor value="Green, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="WARN"/>
            <foreColor value="White, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="INFO"/>
            <foreColor value="Yellow, HighIntensity"/>
          </mapping>
          <mapping>
            <level value="ERROR"/>
            <foreColor value="Red, HighIntensity"/>
          </mapping>

          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
          <threshold value="ALL"/>
          <param name="File" value="logs/PluginShellPlugin"/>
          <param name="AppendToFile" value="true"/>
          <param name="RollingStyle" value="Date"/>
          <param name="DatePattern" value=".yyyy.MM.dd.'txt'"/>
          <param name="StaticLogFileName" value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <LoggerToMatch value="ApplicationPlugins.PluginShell"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
        </appender>
        <appender name="smtp" type="log4net.Appender.SmtpAppender, log4net">
          <threshold value="ERROR"/>
          <to value="blah@blah.com"/>
          <from value="blah@blah.com"/>
          <subject value="Plugin Shell Error Message"/>
          <smtpHost value="localhost"/>
          <bufferSize value="1"/>
          <lossy value="false"/>
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%date [%-5thread] %-5level %logger - %message%newline %exception"/>
          </layout>
        </appender>
        <root>
          <level value="INFO"/>
          <appender-ref ref="rollingFile"/>
          <appender-ref ref="smtp"/>
        </root>
      </log4net>
    </setting>
  </stage>

</application.settings>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
I have been in software development for about 15 years or so. I started out with a small book on QuickBASIC, then moved the Visual Basic for DOS, then Visual Basic for Windows, then Visual Basic .NET and eventually Visual C#. When I am not working at my full time job I donate my time to several community efforts like:

Former President of INETA North America, currently Vice President.
President of the Southeast Valley .NET User Group (SEVDNUG) in Chandler, AZ.
Serving on my City's Parks and Recreation board.

I have or have had the following "MVP" awards:

  • Visual Basic MVP in 1996
  • C# MVP since 2009
  • Telerik MVP since 2010

I maintain a Open Source project on CodePlex which wraps the Bing API called BingSharp.

I also help / organize or participate in several community events:

  • Desert Code Camp
  • AZGiveCamp
  • Organizer for the 1st Time MVP event at the MVP Summit
  • MVP 2 MVP Sessions at MVP Summit.
  • Awesome bean pusher at GeekGive at the MVP Summit.

Comments and Discussions