Example #1
0
        /// <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);
            }
        }
Example #2
0
        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);
            }
        }