[PL] MTS 2009 się zakończył – obiecane prezentacje
Witam was, tak jak obiecałem na konferencji publikuję komplet materiałów z moich prezentacji na konferencji Microsoft Technology Summit:
* Modelowanie w Visual Studio 2010 [zip]
Kod klasy uruchamiającej skrypty w Ruby i IronPython poniżej.
Drobna uwaga dla tych, którzy by chcieli na jednym hoście mieć możliwość uruchamiania zarówno skrypty Ruby jak i IronPython. Jeśli osobno pobierzecie binaria jednego i drugiego, to będziecie mieli konflikt Assemblies związanych DLR.
W takiej sytuacji polecam binariów z dlr.codeplex.com gdzie zawarty jest i IronPython i Ruby w jednym buildzie.
Źródła:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Scripting.Hosting;
using Microsoft.Scripting;
using IronRuby;
namespace ScriptHost
{
public interface IBaseScriptRunner
{
bool Initialize();
string Execute(string sourceScript);
}
public class RubyScriptRunner : IBaseScriptRunner
{
//private members:
LanguageSetup setup;
ScriptEngine engine;
ScriptScope scope;
byte[] rawStream;
public virtual bool Initialize()
{
try
{
setup = Ruby.CreateRubySetup();
engine = Ruby.CreateEngine();
scope = engine.CreateScope();
scope.SetVariable("copyright", "(c) 2009 Daniel Biesiada");
var context = IronRuby.Ruby.GetExecutionContext(engine);
var stdout = (from gv in context.GlobalVariables
where gv.Key == "stdout"
select gv).First().Value;
rawStream = new byte[1024];
MemoryStream memStream =
new MemoryStream(rawStream);
IronRuby.Builtins.RubyIO rio =
new IronRuby.Builtins.RubyIO(context,
memStream,
IronRuby.Builtins.RubyFileMode.APPEND);
stdout.SetValue(context, null, "stdout", rio);
return true;
}
catch
{
return false;
}
}
public string Execute(string sourceScript)
{
var script =
engine.CreateScriptSourceFromString(sourceScript);
try
{
var result = script.Execute(scope);
if (result != null)
{
return result.ToString();
}
else
{
string sout = "";
foreach (byte b in rawStream)
{
if (b != 0)
sout += (char)b;
}
return sout;
}
}
catch (Exception err)
{
return "{Syntax Error: " + err.Message + "}";
}
}
}
public class PythonScriptRunner : IBaseScriptRunner
{
ScriptEngine engine;
ScriptScope scope;
public virtual bool Initialize()
{
try
{
var rnt =
IronPython.Hosting.Python.CreateRuntime();
engine = rnt.GetEngine("py");
scope = engine.CreateScope();
return true;
}
catch
{
return false;
}
}
public string Execute(string sourceScript)
{
var script =
engine.CreateScriptSourceFromString(sourceScript);
try
{
var result = script.Execute();
if (result != null)
{
return result.ToString();
}
else
{
//TODO: wrap up standard output
return "{null}";
}
}
catch (SyntaxErrorException syntaxError)
{
return "Syntax Error: " + syntaxError.ToString();
}
//return null;
}
}
}
/**
#Przykładowy skrypt Ruby do sprawdzenia
#cities.rb
cities = %w[ London
Oslo
Paris
Amsterdam
Berlin ]
visited = %w[Berlin Oslo]
puts copyright, "I still need " +
"to visit the " +
"following cities:",
cities - visited
*/