public PluginContext LoadPlugin(string libPath) { if (!File.Exists(libPath)) { throw new FileNotFoundException("File doesn't exist", libPath); } if (m_pluginContexts.Any(entry => Path.GetFullPath(entry.AssemblyPath) == Path.GetFullPath(libPath))) { throw new Exception("Plugin already loaded"); } byte[] asmData = File.ReadAllBytes(libPath); Assembly pluginAssembly = Assembly.Load(asmData); var pluginContext = new PluginContext(libPath, pluginAssembly); bool initialized = false; // search the entry point (the class that implements IPlugin) foreach (Type pluginType in pluginAssembly.GetTypes()) { if (pluginType.IsPublic && !pluginType.IsAbstract) { if (pluginType.HasInterface(typeof(IPlugin))) { if (initialized) { throw new PluginLoadException("Found 2 classes that implements IPlugin. A plugin can contains only one"); } pluginContext.Initialize(pluginType); initialized = true; RegisterPlugin(pluginContext); } } } if (initialized) { logger.Info("Plugin '{0}' loaded", pluginContext.Plugin.Name); } else { logger.Error("Plugin {0} has no IPlugin entry point", pluginContext.PluginAssembly.GetName().Name); } return(pluginContext); }