/// <summary>
        /// Determines whether the specified <see cref="CyrusBuilt.MonoPluginFramework.AvailablePlugin"/>
        /// is equal to the current <see cref="CyrusBuilt.MonoPluginFramework.AvailablePlugin"/>.
        /// </summary>
        /// <param name='plugin'>
        /// The <see cref="CyrusBuilt.MonoPluginFramework.AvailablePlugin"/> to
        /// compare with the current <see cref="CyrusBuilt.MonoPluginFramework.AvailablePlugin"/>.
        /// </param>
        /// <returns>
        /// <c>true</c> if the specified <see cref="CyrusBuilt.MonoPluginFramework.AvailablePlugin"/>
        /// is equal to the current <see cref="CyrusBuilt.MonoPluginFramework.AvailablePlugin"/>;
        /// otherwise, <c>false</c>.
        /// </returns>
        public Boolean Equals(AvailablePlugin plugin)
        {
            if (plugin == null) {
                return false;
            }

            if ((Object)plugin == null) {
                return false;
            }

            return ((this._assemblyPath == plugin.AssemblyPath) &&
                    (this._pluginInstance == plugin.Instance));
        }
 /// <summary>
 /// Removes the first occurrence of a specified <see cref="AvailablePlugin"/>
 /// from the collection.
 /// </summary>
 /// <param name="plugin">
 /// The <see cref="AvailablePlugin"/> to remove from the collection.
 /// </param>
 public void Remove(AvailablePlugin plugin)
 {
     base.List.Remove(plugin);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="CyrusBuilt.MonoPluginFramework.DuplicatePluginInstanceException"/>
 /// class with the plugin that is a duplicate.
 /// </summary>
 /// <param name="plugin">
 /// The plugin that is an instance duplicate of another.
 /// </param>
 public DuplicatePluginInstanceException(AvailablePlugin plugin)
     : base("Duplicate plugin instance detected: " + plugin.Instance.Name + " v" + plugin.Instance.Version.ToString())
 {
     this._instance = plugin;
 }
 /// <summary>
 /// Determines the index of a specific <see cref="AvailablePlugin"/> in
 /// the collection.
 /// </summary>
 /// <param name="plugin">
 /// The <see cref="AvailablePlugin"/> to locate in the collection.
 /// </param>
 /// <returns>
 /// The index of the <see cref="AvailablePlugin"/> if found in the
 /// collection; Otherwise, -1.
 /// </returns>
 public Int32 IndexOf(AvailablePlugin plugin)
 {
     return base.List.IndexOf(plugin);
 }
 /// <summary>
 /// Inserts a <see cref="AvailablePlugin"/> into the collection at the
 /// specified index.
 /// </summary>
 /// <param name="index">
 /// The zero-based index at which the <see cref="AvailablePlugin"/>
 /// should be inserted.
 /// </param>
 /// <param name="plugin">
 /// The <see cref="AvailablePlugin"/> to insert into the collection.
 /// </param>
 /// <exception cref="DuplicatePluginInstanceException">
 /// An instance of the specified plugin already exists in the collection.
 /// </exception>
 public void Insert(Int32 index, AvailablePlugin plugin)
 {
     if (base.List.Contains(plugin)) {
         throw new DuplicatePluginInstanceException(plugin);
     }
     base.List.Insert(index, plugin);
 }
 /// <summary>
 /// Copies the elements of the collection to a <see cref="AvailablePlugin"/>
 /// array, starting at a particular array index.
 /// </summary>
 /// <param name="array">
 /// The one-dimensional log entry array that is the destination of the
 /// elements copied from the collection.  The location array must have
 /// zero-based indexing.
 /// </param>
 /// <param name="index">
 /// The zero-based index in the array at which copying begins.
 /// </param>
 public void CopyTo(AvailablePlugin[] array, Int32 index)
 {
     base.List.CopyTo(array, index);
 }
 /// <summary>
 /// Determines whether or not the collection contains a specific
 /// <see cref="AvailablePlugin"/>.
 /// </summary>
 /// <param name="plugin">
 /// The <see cref="AvailablePlugin"/> to locate in the collection.
 /// </param>
 /// <returns>
 /// true if the <see cref="AvailablePlugin"/> is found in the collection;
 /// Otherwise, false.
 /// </returns>
 public Boolean Contains(AvailablePlugin plugin)
 {
     return base.List.Contains(plugin);
 }
 /// <summary>
 /// Adds the specified <see cref="AvailablePlugin"/> to the collection
 /// if it is not already in the collection.
 /// </summary>
 /// <param name="plugin">
 /// The plugin to add to the collection.
 /// </param>
 /// <returns>
 /// If successful, the zero-based index position into which the plugin
 /// was added; Otherwise, -1.
 /// </returns>			
 public Int32 Add(AvailablePlugin plugin)
 {
     if (!base.List.Contains(plugin)) {
         return base.List.Add(plugin);
     }
     return -1;
 }
        /// <summary>
        /// Loads the specified plugin and adds it to the managed plugin
        /// collection.
        /// </summary>
        /// <param name="file">
        /// The assembly (*.dll file) that is the plugin.
        /// </param>
        private void AddPlugin(FileInfo file)
        {
            if ((file == null) || (!file.Exists)) {
                return;
            }

            Type typeInterface = null;
            IPlugin instance = null;
            AvailablePlugin newPlugin = null;
            Assembly pluginAssembly = Assembly.LoadFrom(file.FullName);
            foreach (Type pluginType in pluginAssembly.GetTypes()) {
                if ((pluginType.IsPublic) && (!pluginType.IsAbstract)) {
                    typeInterface = pluginType.GetInterface("CyrusBuilt.MonoPluginFramework.IPlugin", true);
                    if (typeInterface != null) {
                        // Load the assembly instance if it is a valid plugin.
                        instance = (IPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));

                        // Initialize the plugin and add it to the managed collection.
                        newPlugin = new AvailablePlugin(instance, file.FullName);
                        newPlugin.Instance.Host = this;
                        newPlugin.Instance.Initialize();
                        this._plugins.Add(newPlugin);
                    }
                }
            }
        }
 /// <summary>
 /// Gets the plugin's configuration dialog.
 /// </summary>
 /// <param name="plugin">
 /// The plugin to get the configuration from.
 /// </param>
 /// <returns>
 /// A dialog form containing the settings read from the specified
 /// plugin's configuration.
 /// </returns>
 /// <exception cref="ArgumentNullException">
 /// <paramref name="plugin"/> cannot be null.
 /// </exception>
 public FormPluginSettingsDialog GetConfigurationDialog(AvailablePlugin plugin)
 {
     if (plugin == null) {
         throw new ArgumentNullException("plugin");
     }
     return new FormPluginSettingsDialog(plugin, null);
 }