// -------------------------------------------------------------------------- protected External() { ptr = Internal.extptr; klass = Internal.pass.klass; }
private static void NewClass(ClassPtr ptr, Symbol sym) { Internal.pass.klass = null; try { string name = sym.ToString(); // load assembly according to name string file = SearchPath(name + ".dll"); if (file.Length == 0) return; // throw new ArgumentException("Assembly file " + name + " not found"); Assembly assembly = Assembly.LoadFile(file); if (assembly == null) return; // throw new ArgumentException("Assembly " + name + " could not be loaded"); Type exttp = assembly.GetType(name); if (exttp == null) throw new ArgumentException("Class " + name + " could not be found"); Class klass = new Class(ptr, exttp); // create dummy external ConstructorInfo ctor = exttp.GetConstructor(System.Type.EmptyTypes); if (ctor == null) throw new MissingMethodException("External class must have a default constructor"); Internal.pass.klass = klass; Internal.extptr.Clear(); External dummy = (External)ctor.Invoke(null); // reset flags methodflags = MethodFlags.f_none; // call Setup method MethodInfo setup = exttp.GetMethod("Setup",BindingFlags.NonPublic|BindingFlags.Static,null, new Type[1] { exttp },null); if (setup == null) throw new MissingMethodException("External class must have a Setup function"); object ret = setup.Invoke(exttp, new object[1] { dummy }); ClassType classflags; try { classflags = (ClassType)ret; } catch { classflags = ClassType.Default; } // set callbacks RegisterClass(ptr, sym, classflags, methodflags); } catch (Exception exc) { Internal.pass.klass = null; PostError(exc.ToString()); } }