Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
PluginManager.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Reflection;
6 using System.Text;
7 using System.Threading.Tasks;
8 using SiliconStudio.Core.Diagnostics;
9 
10 namespace SiliconStudio.BuildEngine
11 {
12  public class PluginManager
13  {
14  public IEnumerable<string> PluginAssemblyLocations { get { return pluginAssemblyLocations; } }
15 
16  private readonly List<string> pluginAssemblyLocations = new List<string>();
17 
18  private readonly Logger logger;
19 
20  public PluginManager(Logger logger = null)
21  {
22  this.logger = logger;
23  }
24 
25  public void Register()
26  {
27  AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadAssembly(new AssemblyName(e.Name));
28  }
29 
30  public Assembly LoadAssembly(AssemblyName assemblyName)
31  {
32  return LoadAssembly(assemblyName.Name);
33  }
34 
35  public Assembly LoadAssembly(string assemblyName)
36  {
37  foreach (string pluginLocation in pluginAssemblyLocations)
38  {
39  if (pluginLocation != assemblyName)
40  {
41  string fileName = Path.GetFileNameWithoutExtension(pluginLocation);
42  if (fileName != assemblyName)
43  continue;
44  }
45 
46  if (logger != null)
47  logger.Debug("Loading plugin: {0}", pluginLocation);
48  return Assembly.LoadFrom(pluginLocation);
49  }
50  return null;
51  }
52 
53  public string FindAssembly(string assemblyFileName)
54  {
55  foreach (string pluginLocation in pluginAssemblyLocations)
56  {
57  if (pluginLocation != assemblyFileName)
58  {
59  string fileName = Path.GetFileName(pluginLocation);
60  if (fileName != assemblyFileName)
61  continue;
62  }
63 
64  if (logger != null)
65  logger.Debug("Loading plugin: {0}", pluginLocation);
66  return pluginLocation;
67  }
68  return null;
69  }
70 
71  public void AddPlugin(string filePath)
72  {
73  pluginAssemblyLocations.Add(filePath);
74  }
75 
76  public void AddPluginFolder(string folder)
77  {
78  if (!Directory.Exists(folder))
79  return;
80 
81  foreach (string filePath in Directory.EnumerateFiles(folder, "*.dll"))
82  {
83  if (logger != null)
84  logger.Debug("Detected plugin: {0}", Path.GetFileNameWithoutExtension(filePath));
85  pluginAssemblyLocations.Add(filePath);
86  }
87  }
88  }
89 }
Assembly LoadAssembly(string assemblyName)
Assembly LoadAssembly(AssemblyName assemblyName)
Base implementation for ILogger.
Definition: Logger.cs:10
string FindAssembly(string assemblyFileName)