Other people have mentioned Delegates
, and if you're controlling all of the code and the functionality yourself, this is the best approach, however, if you really want a plug-in based system, such that your application exposes some API, and you allow 3rd-party developers to write an assembly (usually a DLL) that will be loaded and the functionality consumed by your application, you can use a number of methods.
The general approach is that your application (the host application) will publish/expose an assembly with specific interfaces. Other developers will write their assemblies and ensure that their classes implement your application's interfaces. The host application will then usually enumerates through a folder that contains the "plug-in" assemblies and finds assemblies that define a class that implements its interface's. The host application will then dynamically load those assemblies and instantiates the classes.
A good tutorial on this general approach can be found here:
Plugin Architecture using C#
The Managed Extensibility Framework is also another option for a general purposes plugin architecture, but may be overkill for what you are trying to achieve.