/// <summary> /// Removes all linkage from the OMNI Framework for the passed in Assembly. /// </summary> /// <param name="iResult"></param> internal void DeIndexClass(IndexingResult iResult) { if (iResult == null) return; lock (tick) { foreach (string c in iResult.ClassesFound) { for (int i = 0; i < SimDictSize; i++) { if (_msimdict[i] == null) continue; if (_msimdict[i].GetType().FullName.ToLower() != c) continue; self.Error(">>csFactory::INFO: Deleting Proxy Object for class '" + _msimdict[i].GetType().FullName.ToLower() + "'. ID: " + _msimdict[i].GetID() + " Name: " + _msimdict[i].getName()); _msimdict[i].delete(); _msimdict[i] = null; } MObjectCreateDefs.Remove(c); MCustomClassDef.Remove(c); } foreach (string g in iResult.GlobalFunctsFound) _mGlobalFuncts.Remove(g); } }
/// <summary> /// This function reads the passed in Assembly and parses all of the Omni Decorations out and makes them available in the engine. /// Used mainly for internal purposes. /// </summary> /// <param name="mAssembly"></param> /// <returns></returns> internal IndexingResult IndexAssembly(Assembly mAssembly) { IndexingResult iResult = new IndexingResult(); List<Type> classlist = mAssembly.GetTypes().ToList(); classlist.Sort((x, y) => String.CompareOrdinal(x.FullName, y.FullName)); List<CustomClassFunctDef> staticfunctions = new List<CustomClassFunctDef>(); foreach (Type c in classlist) { if (c.FullName != null && c.FullName.StartsWith(_mNameSpace + ".Models.User")) { CustomClassDef ccd = new CustomClassDef {mType = c, mClassName = c.FullName.ToLower(), mCtor = c.GetConstructor(new Type[] {})}; #region Constructor check #if DEBUG ConstructorInfo ci; try { ci = c.GetConstructor(new Type[] {}); } catch (Exception) { throw new Exception("Class " + c.FullName + " does not have a empty constructor."); } ccd.mCtor = ci; #endif #endregion List<MethodInfo> miList = c.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).ToList(); miList.Sort((x, y) => String.CompareOrdinal(x.Name, y.Name)); foreach (MethodInfo mi in miList) { #region Process MethodInfo if (mi.IsStatic && !mi.IsSpecialName && isExposedFunction(mi)) { if (getAlias(mi) != "") { CustomClassFunctDef ccfd = new CustomClassFunctDef {mFunctName = getAlias(mi).ToLower(), mFunctPtr = mi}; staticfunctions.Add(ccfd); } else { CustomClassFunctDef ccfd = new CustomClassFunctDef {mFunctName = mi.Name.ToLower(), mFunctPtr = mi}; staticfunctions.Add(ccfd); } } else if (!mi.IsSpecialName && isExposedFunction(mi)) { if ((mi.GetBaseDefinition().DeclaringType != mi.DeclaringType) || (mi.GetBaseDefinition().DeclaringType.Namespace.StartsWith(_mNameSpace + ".Models.User"))) { if (getAlias(mi) != "") { CustomClassFunctDef ccfd = new CustomClassFunctDef {mFunctName = getAlias(mi).ToLower(), mFunctPtr = mi}; ccd.mFuncts.Add(getAlias(mi), ccfd); } else { CustomClassFunctDef ccfd = new CustomClassFunctDef {mFunctName = mi.Name.ToLower(), mFunctPtr = mi}; ccd.mFuncts.Add(ccfd.mFunctName, ccfd); } } } else if (!mi.IsSpecialName && isExposedSystemFunction(mi)) { if (!ccd.Allowedcallbacks.Contains(mi.Name.ToLower())) ccd.Allowedcallbacks.Add(mi.Name.ToLower()); } #endregion } //Don't add any empty classes to the dictionary. if (!ccd.mFuncts.Any() && !ccd.Allowedcallbacks.Any()) continue; MCustomClassDef.Add(ccd.mClassName, ccd); iResult.ClassesFound.Add(ccd.mClassName); } #if DEBUG else if (!c.FullName.StartsWith(_mNameSpace + ".Models.Base")) Console.WriteLine("!!!WARNING!!!! Skipping C# Type : '" + c.FullName + "'."); #endif } //}); //We are going to sort them to improve performance. staticfunctions.Sort((x, y) => String.CompareOrdinal(x.mFunctName, y.mFunctName)); foreach (CustomClassFunctDef ccfd in staticfunctions) { _mGlobalFuncts.Add(ccfd.mFunctName, ccfd); iResult.GlobalFunctsFound.Add(ccfd.mFunctName); } return iResult; }