private void LoadPluginTypes(bool showErrors)
        {
            lock (_pluginTypesTable)
            {
                // reset existing contents
                _pluginTypesTable.Clear();

                PluginLoader pluginLoader = new PluginLoader(typeof(WriterPlugin).Assembly);

                //register the callbacks for each supported plugin type.
                foreach (Type pluginType in SupportedPluginTypes)
                {
                    //subscribe for a callback when a matching implementation type is found.
                    pluginLoader.AddPluginTypeCallback(pluginType, new PluginLoader.PluginLoadedCallback(RegisterPluginImpl));

                    //create a list to hold discovered plugin implementations.
                    _pluginTypesTable[pluginType] = new ArrayList();
                }

                // load from plugin directory
                if (PluginDirectory != null && Directory.Exists(PluginDirectory))
                {
                    pluginLoader.LoadPluginsFromDirectory(PluginDirectory, showErrors);
                }

                // load from plugins specified in the registry
                LoadPluginsFromRegistryPaths(pluginLoader, showErrors);

                // load from legacy plugin directory
                if (PluginDirectoryLegacy != null && Directory.Exists(PluginDirectoryLegacy))
                {
                    pluginLoader.LoadPluginsFromDirectory(PluginDirectoryLegacy, showErrors);
                }
            }

            // fire event
            if (PluginListChanged != null)
            {
                PluginListChanged(this, EventArgs.Empty);
            }
        }