【IT168 技术文档】DLR(Dynamic Language Runtime)是Silverlight中提供的一套非常强大的动态语言运行时。目前2.0 beta2中支持Python,Ruby和JSX。
利用DLR,你可以很方便的使用熟悉的动态语言编写Silverlight程序。
本文主要介绍如何在托管语言中调用动态语言。
首先,我们需要初始化动态语言的环境配置,从中获取所有可以使用的动态语言列表,然后得到相应动态语言的运行引擎。
ScriptRuntimeSetup setup = new ScriptRuntimeSetup(true); //true表示载入所有支持的动态语言的环境配置
ScriptRuntime runtime = ScriptRuntime.Create(setup); //创建动态语言运行环境
foreach (LanguageProviderSetup langSetup in setup.LanguageProviders) //遍历所有动态语言的环境配置
{
try
{
ScriptEngine engine = null;
if (runtime.TryGetEngine(langSetup.Names[0], out engine)) //尝试获取动态语言的运行引擎
{
//engine就是我们需要的运行引擎
}
}
catch (MissingTypeException) //处理创建不支持的动态语言时可能抛出异常
{
}
}
获取了运行引擎后,我们就可以执行动态语言的代码了
public class MyErrorSink : ErrorSink //编译错误处理
{
IList<string> m_ErrorMsg = new List<string>();
public IList<string> ErrorMsg
{
get { return m_ErrorMsg; }
}
public MyErrorSink()
{
}
public virtual void Add(SourceUnit source, string message, SourceSpan span, int errorCode, Severity severity)
{
if (severity == Severity.Error || severity == Severity.FatalError)
{
m_ErrorMsg.Add(message);
}
}
}
LanguageContext langContext = HostingHelpers.GetLanguageContext(engine);
SourceUnit sourceUnit = langContext.CreateSourceUnit(new SourceStringContentProvider("1/4+3"), null, SourceCodeKind.Expression); //创建代码序列:1/4+3
MyErrorSink errorSink = new MyErrorSink();
try
{
Scope scope = new Scope();
object ret = sourceUnit.Execute(scope, errorSink); //执行动态语言代码,ret就是执行结果的返回值了
if (errorSink.ErrorMsg.Count > 0) //检查编译错误
{
//
}
}
catch (Exception)
{
}
ScriptRuntime runtime = ScriptRuntime.Create(setup); //创建动态语言运行环境
foreach (LanguageProviderSetup langSetup in setup.LanguageProviders) //遍历所有动态语言的环境配置
{
try
{
ScriptEngine engine = null;
if (runtime.TryGetEngine(langSetup.Names[0], out engine)) //尝试获取动态语言的运行引擎
{
//engine就是我们需要的运行引擎
}
}
catch (MissingTypeException) //处理创建不支持的动态语言时可能抛出异常
{
}
}
获取了运行引擎后,我们就可以执行动态语言的代码了
public class MyErrorSink : ErrorSink //编译错误处理
{
IList<string> m_ErrorMsg = new List<string>();
public IList<string> ErrorMsg
{
get { return m_ErrorMsg; }
}
public MyErrorSink()
{
}
public virtual void Add(SourceUnit source, string message, SourceSpan span, int errorCode, Severity severity)
{
if (severity == Severity.Error || severity == Severity.FatalError)
{
m_ErrorMsg.Add(message);
}
}
}
LanguageContext langContext = HostingHelpers.GetLanguageContext(engine);
SourceUnit sourceUnit = langContext.CreateSourceUnit(new SourceStringContentProvider("1/4+3"), null, SourceCodeKind.Expression); //创建代码序列:1/4+3
MyErrorSink errorSink = new MyErrorSink();
try
{
Scope scope = new Scope();
object ret = sourceUnit.Execute(scope, errorSink); //执行动态语言代码,ret就是执行结果的返回值了
if (errorSink.ErrorMsg.Count > 0) //检查编译错误
{
//
}
}
catch (Exception)
{
}