Another way to implement the Inversion of Control (IoC) principle, in addition to the Dependency Injection, is the plug-in design pattern.

The pattern consists in to load an assembly that implements a common interface at runtime. In this way, a class that depends from an object in an other assemby is completely decoupled from it, or rather, it has no reference to dependent assembly.

Plug-In

In Microsoft .Net you can load an assembly at runtime using the reflection:

System.Reflection.Assembly a;
IPlugIn p;

a = System.Reflection.Assembly.Load("assemblyName");
p = (IPlugIn)a.CreateInstance("typeName");
p.DoWork();

Usually the information about the dependent assembly are placed in an external repository, such as the application configuration file or the database.