Plugin Engine
From World Wind Wiki
(Difference between revisions)
Revision as of 11:26, 19 May 2005 (edit) Mashiharu (Talk | contribs) m ← Previous diff |
Revision as of 13:35, 26 May 2005 (edit) (undo) Mashiharu (Talk | contribs) Next diff → |
||
Line 1: | Line 1: | ||
- | A C#/VB/JScript.NET '''Plugin Compiler''' has been committed to [[CVS]] (HEAD). | + | A C#/VB/JScript.NET '''Plugin Engine''' has been added to World Wind (still unreleased, only available from [[CVS]]). |
==Features== | ==Features== | ||
Line 6: | Line 6: | ||
**VB.NET | **VB.NET | ||
**JSCript.net | **JSCript.net | ||
+ | *Load plugins from precompiled .dll files | ||
*Full access to World Wind internals (same as internal code) | *Full access to World Wind internals (same as internal code) | ||
- | *Runs at full speed (same as an integral part of World Wind) | + | *Runs at full speed (compilation on load) |
- | + | ||
- | ==Sample scripts== | + | |
- | *'''Clock (C#)''': On-screen lower-right corner clock. Simple example of how to implement a RenderableObject. | + | |
- | *'''UdpReceiver (C#)''': Listens for incoming UDP packets and commands ww to go to (lat,lon) location. Feature was requested by [http://www.flightgear.org/ Flight Gear] developers. They have code in their flight simulator to remote control World Wind so pilots can use it as a moving map display. | + | |
- | *'''RangeFog (JScript)''': Enables Direct3D fog in the scene. This is also a RenderableObject but written in JScript.Net. | + | |
- | *'''TrackLog (VB.NET)''': Draws line on ground as you move over the globe | + | |
- | *'''ISS (C#)''': Loads model of the International Space Station and displays in an approximately corrrect location (Longitude is 20 degrees off for some reason. Please help Mashi debug, it is driving him crazy.) | + | |
==Engine logic== | ==Engine logic== | ||
When World Wind starts the following steps are performed: | When World Wind starts the following steps are performed: | ||
- | *The [http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/nasa-exp/WorldWind/WorldWind/Script/ScriptCompiler.cs ScriptCompiler] scans '''bin\Plugin''' directory and the 1st level subdirectories of the plugin directory for files ending in any of the supported file extensions. | + | *The [http://cvs.sourceforge.net/viewcvs.py/nasa-exp/WorldWind/WorldWind/PluginEngine/PluginCompiler.cs?view=markup ScriptCompiler] scans '''bin\Plugins''' directory and the 1st level subdirectories of the plugin directory for files ending in any of the supported file extensions. |
*When it finds one it tries to compile the source (to memory) with references to the same assemblies as the app has referenced. | *When it finds one it tries to compile the source (to memory) with references to the same assemblies as the app has referenced. | ||
- | *It then searches the compiled assembly for an implementation of [http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/nasa-exp/WorldWind/WorldWind/Script/IScript.cs IScript]. | + | *It then searches the compiled assembly for an implementation of [http://cvs.sourceforge.net/viewcvs.py/nasa-exp/WorldWind/WorldWind/PluginEngine/Plugin.cs?view=markup Plugin]. |
- | *If it finds one it executes InitializeScript(). | + | |
==Benefits== | ==Benefits== | ||
Line 28: | Line 21: | ||
*Very fast on-the-fly compilation of the scripts. | *Very fast on-the-fly compilation of the scripts. | ||
*Scripts executes with same speed as a precompiled assembly. | *Scripts executes with same speed as a precompiled assembly. | ||
- | *Debuggable inside World Wind project | + | *Debuggable inside World Wind project (World Wind in debug build loads internal plugins) |
*Custom dlls may be dynamically loaded | *Custom dlls may be dynamically loaded | ||
==Drawbacks== | ==Drawbacks== | ||
*Security: The script could wipe out the hard drive or worse. But with a script at least the user can verify the intentions by looking at the source. Even current add-ons (layers) are often .exe installers giving the user no way of identifying evil code. | *Security: The script could wipe out the hard drive or worse. But with a script at least the user can verify the intentions by looking at the source. Even current add-ons (layers) are often .exe installers giving the user no way of identifying evil code. | ||
- | *To unload a script's assembly from memory, WW must be restarted (unless we start messing with appdomains) | + | *To unload a script's assembly from memory completely, WW needs a restarted (there are workarounds (appdomains)) |
- | *With no fixed interface into WW the script could stop working on a new version of WW. | + | *With no nailed down limited interface into WW the script could stop working on a new version of WW. |
==Security Lockdown Fix== | ==Security Lockdown Fix== | ||
Line 58: | Line 51: | ||
So no one can complain about languages. :) | So no one can complain about languages. :) | ||
+ | ==External links== | ||
+ | *Sample scripts in [http://www.mashiharu.com Mashi's space]. | ||
[[Category:Scripting]] | [[Category:Scripting]] | ||
[[Category:Dev]] | [[Category:Dev]] |
Revision as of 13:35, 26 May 2005
A C#/VB/JScript.NET Plugin Engine has been added to World Wind (still unreleased, only available from CVS).
Contents |
Features
- Dynamic compilation and execution of script code written in the following languages:
- C#
- VB.NET
- JSCript.net
- Load plugins from precompiled .dll files
- Full access to World Wind internals (same as internal code)
- Runs at full speed (compilation on load)
Engine logic
When World Wind starts the following steps are performed:
- The ScriptCompiler scans bin\Plugins directory and the 1st level subdirectories of the plugin directory for files ending in any of the supported file extensions.
- When it finds one it tries to compile the source (to memory) with references to the same assemblies as the app has referenced.
- It then searches the compiled assembly for an implementation of Plugin.
Benefits
- Since the compiler for C#,VB and JSCript comes with the .Net Framework no additional third party library is required.
- For other languages (like J#) an install will be needed, and unfortunately I haven't found an easy way of enumerating all available compilers (before .Net 2.0)
- Very fast on-the-fly compilation of the scripts.
- Scripts executes with same speed as a precompiled assembly.
- Debuggable inside World Wind project (World Wind in debug build loads internal plugins)
- Custom dlls may be dynamically loaded
Drawbacks
- Security: The script could wipe out the hard drive or worse. But with a script at least the user can verify the intentions by looking at the source. Even current add-ons (layers) are often .exe installers giving the user no way of identifying evil code.
- To unload a script's assembly from memory completely, WW needs a restarted (there are workarounds (appdomains))
- With no nailed down limited interface into WW the script could stop working on a new version of WW.
Security Lockdown Fix
Following this example we should be able to lockdown FileIO to the AppDir
public static string ReadFile(string filename) { string appDir = Directory.GetCurrentDirectory(); FileIOPermission f = new FileIOPermission(PermissionState.None); f.SetPathList(FileIOPermissionAccess.Read, appDir); f.SetPathList(FileIOPermissionAccess.PathDiscovery, appDir); f.PermitOnly(); // Use Path.GetFilePath() to canonicalize the file name // Use FileStream.OpenRead to open the file // Use FileStream.Read to access and return the data }
From Code Access Security in Practice - MSDN
Code Translator
C#<->VB [1] So no one can complain about languages. :)
External links
- Sample scripts in Mashi's space.