/// <summary> /// Find and instanciate types implementing the CameraManager base class. /// </summary> public static void LoadCameraManagersPlugins() { // A camera plugin is a directory under Plugins/Camera with an XML manifest file and an assembly // implementing the CameraManager abstract class. // To install and uninstall a plugin we add/delete the corresponding folder. // This discovery mechanism is duplicated for each instance. // This adds only a few milliseconds so we don't keep a cache in preferences. string pluginsDirectory = Software.CameraPluginsDirectory; List <CameraManagerPluginInfo> plugins = new List <CameraManagerPluginInfo>(); List <string> directories = Directory.GetDirectories(pluginsDirectory).ToList(); foreach (string directory in directories) { string manifest = Path.Combine(directory, "manifest.xml"); CameraManagerPluginInfo pluginInfo = CameraManagerPluginInfo.Load(manifest); if (pluginInfo == null) { continue; } plugins.Add(pluginInfo); } log.DebugFormat("Loaded camera plugins manifests."); // Load all compatible plugins. foreach (CameraManagerPluginInfo info in plugins) { LoadCameraManagerPlugin(pluginsDirectory, info); } }
private static void LoadCameraManagerPlugin(string pluginsDirectory, CameraManagerPluginInfo info) { string dir = Path.Combine(pluginsDirectory, info.Directory); if (!Directory.Exists(dir)) { log.ErrorFormat("Could not find directory for camera manager plugin: {0}.", info.Name); return; } string assemblyFile = Path.Combine(dir, info.AssemblyName); if (!File.Exists(assemblyFile)) { log.ErrorFormat("Could not find assembly: {0}.", info.AssemblyName); return; } try { // LoadFrom is problematic on many systems for assemblies downloaded from the Internet. // Loading into a different AppDomain is not really possible, the code is too tightly coupled for perfs. Assembly a = Assembly.LoadFrom(assemblyFile); Type t = a.GetType(info.ClassName); LoadCameraManager(t); } catch (ReflectionTypeLoadException ex) { foreach (Exception exception in ex.LoaderExceptions) { log.ErrorFormat(exception.Message.ToString()); } } catch (Exception e) { log.ErrorFormat("Could not load camera manager plugin {0}, {1}", info.Name, e.Message); } }