public static void Main(string[] args) { Assembly asm; Type[] asmTypes; InterfaceMapping map; Type[] interfaces; ArrayList TypesList = new ArrayList(); ArrayList implementingTypes = new ArrayList(); string asmFullPath = null; string ifaceToDiscover = null; if (args.Length < 1 || args.Length > 3) { Usage(); return; } for (int i = 0; i < args.Length; i++) { string arg = args[i]; if (arg.StartsWith("-") && ((i + 1) < args.Length)) { if (arg == "--asm") { asmFullPath = args[++i]; } else { Usage(); return; } } else { // allow only one interface to discover if (ifaceToDiscover != null) { Usage(); return; } ifaceToDiscover = arg; } } // find the assembly if (null == asmFullPath) { asm = Assembly.GetAssembly(typeof(System.Object)); } else { try{ asm = Assembly.LoadFrom(asmFullPath); } catch (Exception e) { Console.WriteLine("Could not open assembly '{0}' for discovery. Error is: " + e.Message, asmFullPath); return; } } asmTypes = asm.GetTypes(); // examine all the public types foreach (Type t in asmTypes) { if (t.IsPublic) { // find out which, if any, interfaces are "in" the type interfaces = t.GetInterfaces(); if (null != interfaces) { // look for the interface we want to discover foreach (Type iface in interfaces) { // this area seems to throw an exception sometimes, just ignore it try{ if (iface.FullName.ToLower() == args[0].ToLower()) { // find out if this type is the one which "declares" the interface map = t.GetInterfaceMap(iface); if (map.TargetMethods[0].DeclaringType.FullName == t.FullName) { // if so, then we found a class to report implementingTypes.Add(t.FullName); } // if } // if }catch {} } // foreach } // if } // if } // foreach // sort the list to make it easier to find what you are looking for implementingTypes.Sort(); Console.WriteLine(XMLUtil.ToXML(implementingTypes, "Type", "ImplementingTypes")); } // Main()