Creates an instance of a class implementing a specific interface in a given assembly.
using System;
using System.IO;
using System.Reflection;
namespace ExplorerPlus.Utilities
{
public static class PluginManager
{
/// <summary>
/// Creates an instance of a class implementing a specific interface in a given assembly.
/// </summary>
/// <param name="interfaceName">The String containing the name of the interface to get. For generic interfaces, this is the mangled name.</param>
/// <param name="assemblyFile">The name or path of the file that contains the manifest of the assembly.</param>
/// <returns>Reference to the created instance if found; otherwise, null.</returns>
public static object CreateInstance(string interfaceName, string assemblyFile)
{
// ensure interface name is not null
if (interfaceName != string.Empty && interfaceName != null && interfaceName.Length > 0)
{
// check if assembly file exists
if (File.Exists(assemblyFile))
{
//Create a new assembly from the plugin file
Assembly pluginAssembly = Assembly.LoadFrom(assemblyFile);
//Next we'll loop through all the Types found in the assembly
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic) //Only look at public types
{
if (!pluginType.IsAbstract) //Only look at non-abstract types
{
//Gets a type object of the interface we need the plugins to match
Type typeInterface = pluginType.GetInterface(interfaceName, true);
//Make sure the interface we want to use actually exists
if (typeInterface != null)
{
return Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
}
}
}
}
}
}
return null;
}
}
}
Related examples in the same category