在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开发带来了新的活力和可能性,我们可以充分利用它的优势,开发出更加优秀的应用程序。
超级会员免费看
5

被折叠的 条评论
为什么被折叠?



