public static void RegisterTypesFromAssembly(Assembly assembly) { if (assembly == null) { return; } #if !XB1 // XB1_ALLINONEASSEMBLY if (m_registeredAssemblies.Contains(assembly)) { return; } m_registeredAssemblies.Add(assembly); if (m_registered.Contains(assembly)) { return; } m_registered.Add(assembly); #endif // !XB1 #if XB1 // XB1_ALLINONEASSEMBLY if (m_registered == true) { return; } m_registered = true; foreach (Type type in MyAssembly.GetTypes()) #else // !XB1 foreach (Type type in assembly.GetTypes()) #endif // !XB1 { var descriptorArray = type.GetCustomAttributes(typeof(MyDefinitionTypeAttribute), false); if (descriptorArray.Length > 0) { if (!type.IsSubclassOf(typeof(MyDefinitionBase)) && type != typeof(MyDefinitionBase)) { MyLog.Default.Error("Type {0} is not a definition.", type.Name); continue; } foreach (MyDefinitionTypeAttribute descriptor in descriptorArray) { m_definitionFactory.RegisterDescriptor(descriptor, type); var pp = (MyDefinitionPostprocessor)Activator.CreateInstance(descriptor.PostProcessor); pp.DefinitionType = descriptor.ObjectBuilderType; m_postProcessors.Add(pp); m_postprocessorsByType.Add(descriptor.ObjectBuilderType, pp); MyXmlSerializerManager.RegisterObSerialzier(descriptor.ObjectBuilderType); } var tp = type; while (tp != typeof(MyDefinitionBase)) { tp = tp.BaseType; HashSet <Type> children; if (!m_childDefinitionMap.TryGetValue(tp, out children)) { children = new HashSet <Type>(); m_childDefinitionMap[tp] = children; children.Add(tp); // make sure it contains itself } children.Add(type); } } } m_postProcessors.Sort(MyDefinitionPostprocessor.Comparer); }