32、在Silverlight中使用DLR:从多语言脚本到自定义语言实现

在Silverlight中使用DLR:从多语言脚本到自定义语言实现

1. 混合Ruby和Python代码处理HTML事件

在Silverlight中,我们可以使用DLR(动态语言运行时)在HTML页面中混合使用不同的动态语言。例如,我们可以用Ruby定义函数,并在Python中注册该函数以处理HTML按钮的事件。以下是一个示例代码:

<html>
<head>
  <script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
  <h1 id="message"></h1>
  <script type="text/ruby">
    def onclick_event_handler(sender, event)
      document.message.innerHTML = "Hello!!!"
    end
  </script>
  <input id="click_me" type="button" value="click me" />
  <script type="text/python">
    import System
    document.click_me.AttachEvent('onclick', System.EventHandler(onclick_event_handler))
  </script>
</body>
</html>

在这个例子中,Ruby代码定义了一个事件处理函数 onclick_event_handler ,Python代码将这个函数注册到按钮的 onclick 事件上。由于Ruby和Python代码都在 <script> 标签内,它们在相同的脚本作用域中执行,因此Python代码可以访问Ruby函数。

2. 脚本化XAML

除了处理HTML DOM,我们还可以使用DLR语言来脚本化XAML(可扩展应用程序标记语言)。XAML是一种.NET对象序列化格式,可以将.NET对象序列化为XML,反之亦然。

2.1 显示XAML矩形

以下是一个在浏览器中显示绿色矩形的示例:

<html>
<head>
  <script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
  <script type="application/xml+xaml" width="150" height="150">
    <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
            Width="150" Height="150">
      <Rectangle Width="50" Height="50" Canvas.Left="20" Canvas.Top="20" Fill="Green" />
    </Canvas>
  </script>
</body>
</html>

在运行时,XML标签将被解析并反序列化为代表画布和矩形的.NET对象。

2.2 使用Python脚本化XAML矩形

下面的示例展示了如何使用Python脚本来更改XAML矩形的颜色:

<html>
<head>
  <script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
  <h1 id="message"></h1>
  <script id="rect" type="application/xml+xaml" width="150" height="150">
    <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
            Width="150" Height="150">
      <Rectangle x:Name="rectangle" Width="50" Height="50"  
                 Canvas.Left="20" Canvas.Top="20" Fill="Green" />
    </Canvas>
  </script>
  <script class="rect" type="text/python">
    import clr
    from System.Windows.Media import (SolidColorBrush, Colors)
    me.rectangle.Fill = SolidColorBrush(Colors.Red)
  </script>
</body>
</html>

在这个例子中,我们通过给XAML代码添加 id 属性来唯一标识它,然后在Python代码中引用该 id 。这样, me 变量就指向了XAML代码的根UI视觉元素,我们可以通过 me.rectangle 来引用XAML矩形,并将其填充颜色更改为红色。

2.3 使用Python处理XAML按钮事件

以下示例展示了如何使用Python函数处理XAML按钮的 Click 事件:

<html>
<head>
  <script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
  <h1 id="message"></h1>
  <script id="rect" type="application/xml+xaml" width="150" height="150">
    <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
            Width="150" Height="150">
      <Rectangle x:Name="rectangle" Width="50" Height="50"  
                 Canvas.Left="20" Canvas.Top="20" Fill="Green" />
      <Button x:Name="clickMeButton" Width="70" Height="20"  
              Canvas.Left="20" Canvas.Top="90" Content="Click Me" />  
    </Canvas>
  </script>
  <script class="rect" type="text/python">
    import clr
    from System.Windows.Media import (SolidColorBrush, Colors)
    def onclick_event_handler(sender, event):
      me.rectangle.Fill = SolidColorBrush(Colors.Red)
    me.clickMeButton.Click += onclick_event_handler  
  </script>
</body>
</html>

需要注意的是,目前“just text”方法不支持在XAML标记中直接注册Python或Ruby函数作为事件处理程序。

3. DLR设置:显示语言控制台

dlr.js 文件包含JavaScript代码,当嵌入到HTML页面中时,它会创建一个Silverlight控件。该文件提供了一些设置,我们可以在将其嵌入到主HTML页面时进行配置。其中一个设置是 console 属性,用于控制是否在主HTML页面中显示语言控制台。

以下是一个显示Python语言控制台的示例:

<html>
<head>
  <script type="text/javascript">
    window.DLR = {}
    DLR.settings = {console: true}
  </script>
  <script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
  <script type="text/python"></script>
</body>
</html>

同样,我们也可以为Ruby语言实现类似的设置:

<html>
<head>
  <script type="text/javascript">
    window.DLR = {}
    DLR.settings = {console: true}
  </script>
  <script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
  <script type="text/ruby"></script>
</body>
</html>

console 属性设置为 true 时,在浏览器中打开页面,会在页面底部显示一个语言控制台,你可以在控制台提示符后输入代码,按回车键进行代码评估并显示结果。

4. 开发环境准备

如果要在Silverlight中使用自定义语言,需要进行一些准备工作。

4.1 软件要求
  • 安装Visual Web Developer 2010 Express。
  • 安装Silverlight 4 Toolkit April 2010 Release和Silverlight 4 Tools for Visual Studio 2010。可以通过安装Microsoft Web Platform Installer 2.0来轻松安装这些组件,也可以分别从相应的网站下载安装。
  • 如果安装后遇到“Silverlight Developer Runtime未安装”的错误信息,可以从http://go.microsoft.com/fwlink/?LinkID=188039下载并安装该运行时。
4.2 为Silverlight构建DLR

在开始编码之前,需要以Silverlight为目标平台构建DLR源代码。具体步骤如下:
1. 打开Visual Studio命令提示符(该命令提示符通常作为Visual Studio C++ 2010 Express安装的一部分)。
2. 在命令提示符中,导航到 C:\Codeplex-DLR-1.0\Src 文件夹,并执行以下命令:

msbuild Hosts\SilverLight\Microsoft.Scripting.SilverLight\Microsoft.Scripting.Silverlight.csproj /p:Configuration="Silverlight 4 Debug" /p:SilverlightPath="C:\Program Files\Microsoft Silverlight\4.0.50826.0"

如果使用不同版本的Silverlight,请相应调整命令中的版本号。执行该命令后, Microsoft.Scripting.Silverlight 项目及其依赖项应能成功构建,生成的程序集位于 C:\Codeplex-DLR-1.0\Src\Hosts\SilverLight\Bin\Debug 文件夹中。
3. 将 C:\Codeplex-DLR-1.0\Src\Hosts\SilverLight\Bin\Debug 文件夹中的文件复制到 C:\ProDLR\lib\SilverlightDLR\debug

通过以上步骤,我们就准备好了构建Silverlight应用程序所需的DLR二进制文件,后续的Silverlight项目将引用这些二进制文件。

5. 实现Hello语言

接下来,我们将实现一个名为Hello的自定义语言,并将其集成到DLR Hosting API中。

5.1 创建Hello语言项目

使用Visual Web Developer 2010 Express创建一个新的C# Silverlight类库项目,命名为 HelloLanguage ,解决方案命名为 HelloConsole 。选择Silverlight 4作为目标版本。该项目需要引用位于 C:\ProDLR\lib\SilverlightDLR\debug Microsoft.Dynamic.dll Microsoft.Scripting.dll 程序集。

5.2 实现DLR Hosting API的提供方

Hello语言接受任何代码作为有效输入,并返回字符串“Hello!!!”作为代码评估的结果。为了将Hello语言集成到DLR Hosting API中,我们需要实现两个类:
- HelloContext 类,继承自 LanguageContext

public class HelloContext : LanguageContext
{
    public HelloContext(ScriptDomainManager domainManager, IDictionary<string, object> options)
        : base(domainManager)
    { }

    public override ScriptCode CompileSourceCode(SourceUnit sourceUnit, CompilerOptions options, ErrorSink errorSink)
    {
        return new HelloScriptCode(sourceUnit);
    }
}
  • HelloScriptCode 类,继承自 ScriptCode
public class HelloScriptCode : ScriptCode
{
    public HelloScriptCode(SourceUnit sourceUnit)
        : base(sourceUnit)
    { }

    public override object Run(Scope scope)
    {
        return "Hello!!!";
    }
}
6. 在Silverlight中创建Hello控制台应用程序

我们将创建一个Silverlight应用程序,直接使用DLR Hosting API和 HelloLanguage.dll 程序集来托管Hello语言。

6.1 创建项目

HelloConsole 解决方案中,选择“File -> New Project…”创建一个新的C# Silverlight应用程序项目。在新项目向导中,展开左侧的Visual C#节点,选择Silverlight子节点,选择“Silverlight Application”项目模板。

6.2 配置Web项目

在新项目向导的下一步中,配置用于托管新Silverlight应用程序的Web项目。

6.3 添加引用

HelloConsole 项目添加以下引用:
- Microsoft.Dynamic.dll Microsoft.Scripting.dll (位于 C:\ProDLR\lib\SilverlightDLR\debug )。
- Microsoft.CSharp.dll
- 同一解决方案中的 HelloLanguage 项目。

6.4 设计UI

打开 MainPage.xaml 文件,将其内容替换为以下代码:

<UserControl x:Class="HelloConsole.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <StackPanel>
        <TextBox x:Name="helloConsole" KeyUp="TextBox_KeyUp"  
                 Height="200" Margin="10"
                 TextWrapping="NoWrap" AcceptsReturn="True"  
                 VerticalScrollBarVisibility="Visible" Text=">>>" />
    </StackPanel>
</UserControl>

该UI使用一个 StackPanel 布局,包含一个 TextBox 作为Hello控制台,用户可以在其中输入Hello代码并查看评估结果。

6.5 实现代码逻辑

MainPage.cs 文件中的代码如下:

public partial class MainPage : UserControl
{
    private ScriptEngine scriptEngine;

    public MainPage()
    {
        InitializeComponent();

        LanguageSetup langSetup = new LanguageSetup(
            typeName: "HelloLanguage.HelloContext,HelloLanguage, Version=1.0.0.0, Culture=neutral",
            displayName: "Hello",
            names: new String[] { "Hello" },
            fileExtensions: new String[] { ".hello" });

        ScriptRuntimeSetup setup = new ScriptRuntimeSetup();
        setup.LanguageSetups.Add(langSetup);
        ScriptRuntime scriptRuntime = new ScriptRuntime(setup);
        scriptEngine = scriptRuntime.GetEngine("Hello");
    }

    private void TextBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            string code = helloConsole.Text.Substring(helloConsole.Text.LastIndexOf(">>>") + 3);
            object result = scriptEngine.Execute(code);
            helloConsole.Text += "\n" + result.ToString() + "\n>>>";
        }
    }
}

在这个代码中, scriptEngine 变量在构造函数中初始化,用于获取Hello语言的脚本引擎。 TextBox_KeyUp 方法处理 TextBox KeyUp 事件,当用户按下回车键时,提取用户输入的代码,使用 scriptEngine 执行代码,并将结果显示在控制台中。

通过以上步骤,我们成功地在Silverlight中实现了一个自定义语言的控制台应用程序。整个过程涵盖了从环境准备、语言实现到应用程序开发的各个方面,展示了如何利用DLR在Silverlight中实现多语言支持和自定义语言的集成。

在Silverlight中使用DLR:从多语言脚本到自定义语言实现

7. 不同方法的对比与总结

在前面的内容中,我们介绍了在Silverlight中使用DLR的多种方法,包括混合不同语言处理HTML事件、脚本化XAML、显示语言控制台以及实现自定义语言等。下面我们对这些方法进行一个简单的对比总结:
| 方法 | 特点 | 适用场景 |
| — | — | — |
| 混合Ruby和Python处理HTML事件 | 允许在同一HTML页面中使用不同动态语言,通过共享脚本作用域实现交互 | 需要结合不同语言优势处理HTML元素事件时 |
| 脚本化XAML | 可以使用DLR语言操作XAML定义的UI元素,实现动态效果 | 开发具有动态UI变化的Silverlight应用程序 |
| 显示语言控制台 | 提供一个交互式环境,方便测试和执行代码 | 开发过程中的调试和代码测试 |
| 实现自定义语言 | 可以创建自己的语言并集成到DLR中,满足特定需求 | 有独特业务逻辑需要自定义语言支持时 |

通过这些方法的灵活运用,我们可以根据具体的项目需求选择最合适的方案。

8. 未来拓展与思考

在Silverlight中使用DLR为我们带来了很多便利和可能性,未来我们可以在以下几个方面进行拓展:

8.1 更多语言的集成

目前我们主要介绍了Ruby、Python和自定义的Hello语言,实际上DLR支持多种动态语言,如JavaScript、Lua等。我们可以尝试将更多的语言集成到Silverlight应用中,以满足不同的业务需求。例如,在一个需要处理大量数据的应用中,可以使用Python的数据分析库;在处理前端交互时,可以使用JavaScript的灵活性。

8.2 性能优化

随着应用程序的复杂度增加,性能可能会成为一个问题。我们可以研究如何对使用DLR的Silverlight应用进行性能优化,例如优化脚本代码的执行效率、减少内存占用等。可以通过合理使用缓存、优化算法等方式来提高应用的性能。

8.3 与其他技术的结合

可以将Silverlight和DLR与其他流行的技术结合使用,如云计算、大数据等。例如,将Silverlight应用部署到云端,利用云计算的强大计算能力;或者将DLR与大数据处理框架结合,实现对海量数据的分析和处理。

9. 总结

本文详细介绍了在Silverlight中使用DLR的多种方法和技术,从混合不同语言处理HTML事件到脚本化XAML,再到显示语言控制台和实现自定义语言,我们逐步展示了如何利用DLR实现多语言支持和自定义语言的集成。

整个过程可以用以下流程图来概括:

graph TD;
    A[环境准备] --> B[混合语言处理HTML事件];
    A --> C[脚本化XAML];
    A --> D[显示语言控制台];
    A --> E[实现自定义语言];
    B --> F[开发应用];
    C --> F;
    D --> F;
    E --> F;

通过这些技术,我们可以开发出更加灵活、功能强大的Silverlight应用程序。同时,我们也探讨了未来的拓展方向,希望能够为开发者提供更多的思路和启发。在实际开发中,我们可以根据具体的项目需求选择合适的方法和技术,不断探索和创新,以实现更好的应用效果。

总之,DLR为Silverlight开发带来了新的活力和可能性,我们可以充分利用它的优势,开发出更加优秀的应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值