/// <summary> /// Initializes a new instance of the <see cref= "T:WorldWind.PluginEngine.PluginListItem"/> class. /// </summary> public PluginListItem(PluginInfo pi) { this.pluginInfo = pi; this.Text = pi.Name; this.Checked = pi.IsLoadedAtStartup; }
/// <summary> /// Uninstall/delete a plugin. /// </summary> /// <param name="pi"></param> public void Uninstall(PluginInfo pi) { // Unload the plugin Unload(pi); File.Delete( pi.FullPath ); m_plugins.Remove( pi ); }
/// <summary> /// Compiles a file to an assembly using specified compiler. /// </summary> Assembly Compile( PluginInfo pi, CodeDomProvider cdp ) { // Compile //ICodeCompiler compiler = cdp.CreateCompiler(); if(cdp is Microsoft.JScript.JScriptCodeProvider) // JSCript doesn't support unsafe code cp.CompilerOptions = ""; else cp.CompilerOptions = "/unsafe"; // Add references cp.ReferencedAssemblies.Clear(); foreach( string reference in m_worldWindReferencesList) cp.ReferencedAssemblies.Add(reference); // Add reference to core functions for VB.Net users if(cdp is Microsoft.VisualBasic.VBCodeProvider) cp.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll"); // Add references specified in the plugin foreach( string reference in pi.References.Split(',')) AddCompilerReference( pi.FullPath, reference.Trim() ); CompilerResults cr = cdp.CompileAssemblyFromFile( cp, pi.FullPath ); if(cr.Errors.HasErrors || cr.Errors.HasWarnings) { // Handle compiler errors StringBuilder error = new StringBuilder(); foreach (CompilerError err in cr.Errors) { string type = (err.IsWarning ? "Warning" : "Error"); if(error.Length>0) error.Append(Environment.NewLine); error.AppendFormat("{0} {1}: Line {2} Column {3}: {4}", type, err.ErrorNumber, err.Line, err.Column, err.ErrorText ); } Log.Write(Log.Levels.Error, LogCategory, error.ToString()); if(cr.Errors.HasErrors) throw new Exception( error.ToString() ); } // Success, return our new assembly return cr.CompiledAssembly; }
/// <summary> /// Unload a plugin if it's loaded. /// </summary> public void Unload(PluginInfo pi) { if(!pi.IsCurrentlyLoaded) return; pi.Plugin.PluginUnload(); }
/// <summary> /// Load a plugin /// </summary> public void Load(PluginInfo pi) { if(pi.Plugin == null) { // Try to find a suitable compiler string extension = Path.GetExtension(pi.FullPath).ToLower(); Assembly asm = null; if(extension==".dll") { // Load pre-compiled assembly asm = Assembly.LoadFile(pi.FullPath); } else { CodeDomProvider cdp = (CodeDomProvider)codeDomProviders[extension]; if(cdp==null) return; asm = Compile(pi, cdp); } pi.Plugin = GetPluginInterface(asm); } string pluginPath = MainApplication.DirectoryPath; if( pi.FullPath != null && pi.FullPath.Length > 0) pluginPath = Path.GetDirectoryName(pi.FullPath); pi.Plugin.PluginLoad(worldWind, pluginPath); }
/// <summary> /// Adds plugin from one of the plugins /// </summary> void AddPlugin(string path) { foreach (string filename in Directory.GetFiles(path)) { bool isAlreadyInList = false; foreach(PluginInfo info in m_plugins) { if(info.FullPath == filename) { isAlreadyInList = true; break; } } if(isAlreadyInList) continue; string extension = Path.GetExtension(filename).ToLower(); if(HasCompiler(extension) || IsPreCompiled(extension)) { PluginInfo plugin = new PluginInfo(); plugin.FullPath = filename; m_plugins.Add(plugin); } } }
/// <summary> /// Scan for plugins inside an assembly. /// </summary> public void FindPlugins( Assembly assembly ) { foreach( Type t in assembly.GetTypes() ) { if(!t.IsClass) continue; if(!t.IsPublic) continue; if(t.BaseType!=typeof(Plugin)) continue; try { PluginInfo pi = new PluginInfo(); pi.Plugin = (Plugin) assembly.CreateInstance( t.ToString() ); pi.Name = t.Name; pi.Description = "World Wind internally loaded plugin."; m_plugins.Add(pi); } catch { // Ignore exceptions during entry point search. } } }