private static void LoadDelayedSubModules() { foreach (var mod in ModuleInfo.GetModules()) { if (!mod.IsSelected) { continue; } var id = mod.Id; var subModsXmlPath = ModuleInfo.GetPath(id); var modDir = Path.GetDirectoryName(subModsXmlPath); if (modDir == null) { continue; } var subModsXml = new XmlDocument(); subModsXml.Load(subModsXmlPath); var delayedSubMods = subModsXml.SelectNodes("/Module/DelayedSubModules/SubModule")?.OfType <XmlElement>(); if (delayedSubMods == null) { continue; } var main = Module.CurrentModule; var typeMain = typeof(Module); foreach (var elem in delayedSubMods) { var delayedSubModInfo = new SubModuleInfo(); delayedSubModInfo.LoadFrom(elem); var dllPath = Path.Combine(modDir, "bin", Common.ConfigName, delayedSubModInfo.DLLName); var subModAsm = AssemblyLoader.LoadFrom(dllPath); var subModType = subModAsm.GetType(delayedSubModInfo.SubModuleClassType); if (!typeof(MBSubModuleBase).IsAssignableFrom(subModType)) { continue; } var delayLoadedSubMod = (MBSubModuleBase)subModType.InvokeMember(".ctor", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance, null, null, new object[0]); typeMain.InvokeMember("AddSubModule", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, main, new object[] { subModAsm, delayedSubModInfo.SubModuleClassType }); var subMods = (ICollection <MBSubModuleBase>)typeMain.InvokeMember("_submodules", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, main, new object[0]); subMods.Add(delayLoadedSubMod); subModType.InvokeMember(nameof(OnSubModuleLoad), BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, delayLoadedSubMod, new object[0]); } } }