private void InjectDGJ() { Assembly dgjAssembly = Assembly.GetAssembly(typeof(SearchModule)); //如果没有点歌姬插件,插件的构造方法会抛出异常,无需考虑这里的assembly == null的情况 Assembly dmAssembly = Assembly.GetAssembly(Application.Current.MainWindow.GetType()); Type appType = dmAssembly.ExportedTypes.FirstOrDefault(p => p.FullName == "Bililive_dm.App"); ObservableCollection <DMPlugin> Plugins = (ObservableCollection <DMPlugin>)appType.GetField("Plugins", BindingFlags.GetField | BindingFlags.Static | BindingFlags.Public).GetValue(null); DMPlugin dgjPlugin = Plugins.FirstOrDefault(p => p.ToString() == "DGJv3.DGJMain"); object dgjWindow = null; try { dgjWindow = dgjAssembly.DefinedTypes.FirstOrDefault(p => p.Name == "DGJMain").GetField("window", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(dgjPlugin); } catch (ReflectionTypeLoadException Ex) // 缺少登录中心时 { dgjWindow = Ex.Types.FirstOrDefault(p => p.Name == "DGJMain").GetField("window", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(dgjPlugin); } object searchModules = dgjWindow.GetType().GetProperty("SearchModules", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public).GetValue(dgjWindow); ObservableCollection <SearchModule> searchModules2 = (ObservableCollection <SearchModule>)searchModules.GetType().GetProperty("Modules", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public).GetValue(searchModules); SearchModule nullModule = (SearchModule)searchModules.GetType().GetProperty("NullModule", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance).GetValue(searchModules); SearchModule lwlModule = searchModules2.FirstOrDefault(p => p != nullModule); if (lwlModule != null) { Action <string> logHandler = (Action <string>)lwlModule.GetType().GetProperty("_log", BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(lwlModule); ExtendNeteaseModule.SetLogHandler(logHandler); } searchModules2.Insert(2, ExtendNeteaseModule); }
private void InjectDGJ() { try { Assembly dgjAssembly = Assembly.GetAssembly(typeof(SearchModule)); //如果没有点歌姬插件,插件的构造方法会抛出异常,无需考虑这里的assembly == null的情况 DMPlugin dgjPlugin = Douyulive_dm.App.Plugins.FirstOrDefault(p => p.GetType() == typeof(DGJMain)); if (dgjPlugin == null) // 没有点歌姬 { throw new DllNotFoundException(); } object dgjWindow = null; try { dgjWindow = dgjAssembly.DefinedTypes.FirstOrDefault(p => p.Name == "DGJMain").GetField("window", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(dgjPlugin); } catch (ReflectionTypeLoadException Ex) // 缺少登录中心时 { dgjWindow = Ex.Types.FirstOrDefault(p => p.Name == "DGJMain").GetField("window", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(dgjPlugin); } object searchModules = dgjWindow.GetType().GetProperty("SearchModules", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public).GetValue(dgjWindow); ObservableCollection <SearchModule> searchModules2 = (ObservableCollection <SearchModule>)searchModules.GetType().GetProperty("Modules", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public).GetValue(searchModules); SearchModule nullModule = (SearchModule)searchModules.GetType().GetProperty("NullModule", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance).GetValue(searchModules); SearchModule coelModule = searchModules2.FirstOrDefault(p => p != nullModule); ExtendNeteaseModule = new ExtendNeteaseModule(); if (coelModule != null) { Action <string> logHandler = (Action <string>)coelModule.GetType().GetProperty("_log", BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(coelModule); ExtendNeteaseModule.SetLogHandler(logHandler); } searchModules2.Insert(2, ExtendNeteaseModule); } catch (DllNotFoundException) { throw; } catch (Exception Ex) { MessageBox.Show($"注入到点歌姬失败了喵\n{Ex}", "本地网易云喵块", 0, MessageBoxImage.Error); throw; } }