Regarding Jurassic, the pros:
- Written in C#
- Allow a good interoperability with code and data between the .NET world and the JavaScript world. see "Exposing a .NET class to JavaScript".
- Can be compiled for .NET 3.5 and 4.x
- Open source
- JavaScript 5 compatible
- Compile the JavaScript into MSIL via Reclection.Emit/DynamicMethod
- Therefore provide better performance than classical interpreter
- Compile on Sliverlight and Windows phone 7 .NET framework
- May be compiled on MacOS or Linux with Mono (I think).
The cons:
- Compile the JavaScript into MSIL via Reclection.Emit/DynamicMethod
- Cannot be compiled on iOS with Mono/MonoTouch
- I am not sure if it can be compiled on Windows 8 phone and Windows 8 RT
That said if your target platform is Windows, it is a great run-time to build scriptable application.
I wanted to create ultra simple Api in C# that can be called from the JavaScript world. My Api is just one method called __createItem(string itemName, string itemGuid).I also want my favorite JavaScript libraries to be by default available.
The file Main.js contains the JavaScript.
Here is all the C# code I need to do that.
static void Main(string[] args)
{
var engine = new Jurassic.ScriptEngine();
// Export the print method to the JavaScript world
engine.SetGlobalFunction("print", new Action<object>((o) => {
Console.WriteLine(o == null ? "null" : o.ToString());
}));
// Export my own api to the JavaScript world
engine.SetGlobalFunction("__createItem", new Func<string, string, bool>((itemName, itemGuid) => {
Console.WriteLine(string.Format("Creating item {0}, {1}", itemName, itemGuid));
return true;
}));
var jsSource = new StringBuilder(1000);
// My personal JavaScript libraries
var a = Assembly.GetExecutingAssembly();
jsSource.Append(DS.Resources.GetTextResource("dictionary.js" , a)).AppendLine();
jsSource.Append(DS.Resources.GetTextResource("list.js" , a)).AppendLine();
jsSource.Append(DS.Resources.GetTextResource("stack.js" , a)).AppendLine();
jsSource.Append(DS.Resources.GetTextResource("string.js" , a)).AppendLine();
jsSource.Append(DS.Resources.GetTextResource("stringbuilder.js", a)).AppendLine();
jsSource.Append(DS.Resources.GetTextResource("sys.js" , a)).AppendLine();
// Create a nice JavaScript wrapper for my C# Api exposed
jsSource.Append(DynamicSugar.DS.Resources.GetTextResource("MyApi.js", a)).AppendLine();
jsSource.Append(DynamicSugar.DS.Resources.GetTextResource("Main.js", a)).AppendLine();
jsSource.Append("main();"); // Call the main function
engine.SetGlobalValue("ExitCode", 0);
try
{
engine.Execute(jsSource.ToString());
}
catch(Jurassic.JavaScriptException ex)
{
Console.WriteLine("Error:{0}, Line:{1}\r\n{2}".format(ex.Message, ex.LineNumber, ex.Source));
}
Console.WriteLine(engine.GetGlobalValue<int>("ExitCode"));
Console.ReadKey();
}
What is great with this kind of architecture is that I can wrap the C# functions exposed to the JavaScript world in a nice singleton wrapper, which give
a complete a JavaScript feel.
/*
* Wrapper the C# api with nice JavaScript singelton object
*/
var MyApi = (function () {
var _myApi = {};
_myApi.createItem = function (item) { return __createItem(item.Name, item.Guid); }
return _myApi;
})();
And to finish here is the Main.js. In my protoype this file is embed in a real case this file would be loaded from the disk.
function main() {
var item = {
Name : "foo",
Guid : "{0321ADD2-07FE-4A93-9868-89D8DF054333}"
};
print("Item {Name}, {Guid}".format(item));
MyApi.createItem(item);
}
You can find the source code at jura1.zip.In a next post I will show how to create a method in my Singleton MyApi, that accept a callback function.
No comments:
Post a Comment