Welcome to MSDN Blogs Sign in | Join | Help

CLR & Silverlight上海研发团队的Blog

专注底层技术

Syndication

News

如果你对CLR或Silverlight有什么意见或建议,欢迎在此博客中留言。如有技术问题,欢迎访问MSDN中文论坛进行提问(请参阅链接)。 贴子以"现状"提供且没有任何担保也没有授予任何权利。如果需要转载、录用文章,必须在此留言与博客管理员书面联系取得许可,并在转载文章中注明出处。
DLR in Silverlight

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"), nullSourceCodeKind.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)
{
}

是不是很方便呢 :-) 完整的DLR文档请参考http://compilerlab.members.winisp.net/dlr-spec-hosting.pdf(英文版)

PS:你也可以使用配置文件或者直接初始化动态语言运行引擎。

Software Development Engineer
范翔

Published Thursday, September 18, 2008 10:48 AM by SilverlightShanghai

Filed under:

Comments

# DLR in Silverlight : EasyCoded @ Thursday, September 18, 2008 12:44 AM

PingBack from http://www.easycoded.com/dlr-in-silverlight/

DLR in Silverlight : EasyCoded

# 近期团队博客的摘要 9 @ Thursday, October 02, 2008 6:25 AM

袖珍超级计算机Cray CX1 微软和Cray两家公司在历史上首次联手,提供各自最好的技术生产出了 Cray CX1 ! CX1是个什么东东呢?它是一个运行Windows HPC Server 2008的超级计算机,大小和普通PC相当。这是Cray公司迄今为止提供的最实惠的超级计算机:两万五千美金,微软、Cray和其他一些公司9月15日早上八点宣布开始供货。

服务世界 开发未来

Anonymous comments are disabled
 
© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement  
Page view tracker