class PluginHelper { // Loading a bunch of objects dynamically using reflection // In this case the type parameter specifies an interface for // an object with a public default constructor public static IList<INTERFACE> LoadPlugins<INTERFACE>( string searchPath) //where INTERFACE : // (only reference types) { List<INTERFACE> objList = new List<INTERFACE>(); string[] files = Directory.GetFiles(searchPath, "*.dll"); foreach (string file in files) { try { Assembly assembly = Assembly.LoadFrom(file); foreach (Type type in assembly.GetTypes()) { if (!type.IsClass || type.IsNotPublic) continue; Type[] interfaces = type.GetInterfaces(); if (((IList<Type>)interfaces).Contains(typeof(INTERFACE))) { try { // Find the default constructor ConstructorInfo conInfo = type.GetConstructor(new Type[0]); bool hasPublicDefaultConstructor = ((conInfo != null) && ((conInfo.Attributes | MethodAttributes.Public) > 0)); if (hasPublicDefaultConstructor) { object obj = Activator.CreateInstance(type); INTERFACE instance = (INTERFACE)obj; Debug.Assert(instance != null); objList.Add(instance); } else { Trace.WriteLine("LoadPlugins<INTERFACE>() - Can not create the type \'" + type.ToString() + "\' in assembly \'" + file + "\' as it does not have a public default constructor"); } } catch (Exception ex) { Trace.WriteLine("Exception occurred creating an instance of \'" + type.ToString() + "\' from assembly \'" + file + "\'"); } } } } catch (Exception ex) { Trace.WriteLine("Exception occurred trying to load from assembly \'" + file + "\'"); } } return objList; } }
August 10, 2008
Loading Objects Using Reflection
This helper class loads a bunch of objects from assemblies found in the specified search path. The objects must support an interface of the given type
eg usage.
List<ISomeInterface> plugIns = PluginHelper.LoadPlugins
<ISomeInterface>(@".\");
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment