public static InvokerClassInfo GetClassReference(string assemblyName, string className)
        {
            if (ClassReferences.ContainsKey(assemblyName) == false)
            {
                Assembly assembly;
                if (AssemblyReferences.ContainsKey(assemblyName) == false)
                {
                    AssemblyReferences.Add(assemblyName, assembly = Assembly.LoadFrom(assemblyName));
                }
                else
                    assembly = (Assembly) AssemblyReferences[assemblyName];

                // Walk through each type in the assembly
                foreach (Type type in assembly.GetTypes())
                {
                    if (type.IsClass)
                    {
                        // doing it this way means that you don't have
                        // to specify the full namespace and class (just the class)
                        if (type.FullName.EndsWith("." + className))
                        {
                            var ci = new InvokerClassInfo(type,
                                                          Activator.CreateInstance(type));
                            ClassReferences.Add(assemblyName, ci);
                            return (ci);
                        }
                    }
                }
                throw (new Exception("Could not instantiate class"));
            }
            return ((InvokerClassInfo) ClassReferences[assemblyName]);
        }
 public static Object InvokeMethod(InvokerClassInfo ci, string methodName, Object[] args)
 {
     // Dynamically Invoke the method
     object result = ci.Type.InvokeMember(methodName,
                                          BindingFlags.Default | BindingFlags.InvokeMethod,
                                          null,
                                          ci.ClassObject,
                                          args);
     return (result);
 }