PluginController.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reflection;
  6. namespace MediaBrowser.Common.Plugins
  7. {
  8. public class PluginController
  9. {
  10. public string PluginsPath { get; set; }
  11. public PluginController(string pluginFolderPath)
  12. {
  13. PluginsPath = pluginFolderPath;
  14. }
  15. public IEnumerable<IPlugin> GetAllPlugins()
  16. {
  17. AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
  18. AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
  19. if (!Directory.Exists(PluginsPath))
  20. {
  21. Directory.CreateDirectory(PluginsPath);
  22. }
  23. List<IPlugin> plugins = new List<IPlugin>();
  24. foreach (string folder in Directory.GetDirectories(PluginsPath, "*", SearchOption.TopDirectoryOnly))
  25. {
  26. IPlugin plugin = GetPluginFromDirectory(folder);
  27. plugin.Path = folder;
  28. if (plugin != null)
  29. {
  30. plugins.Add(plugin);
  31. }
  32. }
  33. return plugins;
  34. }
  35. private IPlugin GetPluginFromDirectory(string path)
  36. {
  37. string dll = Directory.GetFiles(path, "*.dll", SearchOption.TopDirectoryOnly).FirstOrDefault();
  38. if (!string.IsNullOrEmpty(dll))
  39. {
  40. return GetPluginFromDll(dll);
  41. }
  42. return null;
  43. }
  44. private IPlugin GetPluginFromDll(string path)
  45. {
  46. return FindPlugin(Assembly.Load(File.ReadAllBytes(path)));
  47. }
  48. private IPlugin FindPlugin(Assembly assembly)
  49. {
  50. var plugin = assembly.GetTypes().Where(type => typeof(IPlugin).IsAssignableFrom(type)).FirstOrDefault();
  51. if (plugin != null)
  52. {
  53. return plugin.GetConstructor(Type.EmptyTypes).Invoke(null) as IPlugin;
  54. }
  55. return null;
  56. }
  57. Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
  58. {
  59. AssemblyName assemblyName = new AssemblyName(args.Name);
  60. IEnumerable<string> dllPaths = Directory.GetFiles(PluginsPath, "*.dll", SearchOption.AllDirectories);
  61. string dll = dllPaths.FirstOrDefault(f => Path.GetFileNameWithoutExtension(f) == assemblyName.Name);
  62. if (!string.IsNullOrEmpty(dll))
  63. {
  64. return Assembly.Load(File.ReadAllBytes(dll));
  65. }
  66. return null;
  67. }
  68. }
  69. }