Exemple #1
0
        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;
     }
 }