【原文地址】Programming Silverlight with Dynamic Languages

 

 

介绍

这个快速入门例程展示了如何创建使用了托管代码和动态语言的基于微软的Silverlight的应用,以及如何在Visual Studio 2008中调试应用。

Visual Studio 2008之Siverlight工具Beta 1版本包含了动态语言运行时(DLR)和三门动态语言(IronPython, IronRuby, 和托管JScript)的快照。Visual Studio 2008目前还不提供动态语言的项目模板,但你可以使用Chiron.exe 工具来建造,运行和调试你的应用。

DLR和动态语言目前在Codeplex网站,尚处于开发之中。你可以在那里找到有关的详细信息,包括新的版本,源代码,和另外的Silverlight例程。新的版本会经常地发布出来。

 

本文讨论了下述主题:

  • 创建一个基于Silverlight的动态语言应用,并用Chiron.exe运行该应用

  • 创建一个.xap部署文件

  • 访问托管程序集中的类库

  • 使用Chiron.exe和Visual Studio调试基于Silverlight的动态语言应用

软件要求 (可从 Silverlight下载网站获取):

  • Silverlight 2 Beta 1版本

  • Visual Studio 2008

  • Visual Studio 2008之Silverlight 工具Beta 1版本

用动态语言创建基于Silverlight的应用

一个使用动态语言的基于Silverlight的简单应用包括下列组成部分:

  • 根目录的HTML或.aspx文件,作为浏览器的入口点

  • app.xaml文件,定义了你的基于Siliverlight应用的用户界面

  • app.py, app.rb, 或app.jsx 文件,内含在运行时处理事件的动态语言代码。对动态语言来说,这个文件是不被编译成一个程序集的,动态语言的代码是在运行时在客户端计算机上编译和执行的

    动态语言引擎和DLR程序集是包含在由Chiron.exe 生成的.xap 文件中,并下载到客户端计算机的。你不需要在你的项目中包含它们。

使用动态语言创建和运行基于Silverlight的应用

  1. 为你的应用创建一个文件夹.

  2. In the application folder, create two folders named app and assets. Use the assets folder for bitmaps and additional XAML files.在应用的文件夹中,创建2个子文件夹,分别名为app和 assets。用assets存放位图和另外的XAML文件。

    如果你想使用silverlight.js来在应用启动时做更大的控制,assets文件夹是存放silverlight.js的好所在。本例程中的应用不使用silverlight.js。你的应用不必局限于这个简单的文件夹结构。这只是一个可为Chiron.exe所用,不用指定任何特别参数的基本的结构。你的应用程序可以访问任意复杂的文件夹结构,可以包含任意数目的动态语言代码文件。

  3. 在app文件夹中,创建app.xaml。这个文件包含你的应用的根可视元素。一个简单的基于UserControl的app.xaml文件看上去也许会象这样:

    <UserControl
       xmlns="http://schemas.microsoft.com/client/2007"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       x:Class="System.Windows.Controls.UserControl"
       x:Name="Page" 
       >
       
       <TextBlock x:Name="TextBlock1" TextWrapping="Wrap" 
          Foreground="Black" Text="Click Me." />
    </UserControl>

    将根可视元素基于UserControl是推荐的做法,使用本文一开始的“查看源码”按钮看一下另外一个app.xaml的例子。

  4. 在app文件夹中,创建一个动态语言源码文件,内含你的应用代码。下面的代码展示了一个响应鼠标按钮事件的非常简单的应用。

    jsx

    Import("System.Windows.*");
    Import("System.Windows.Controls.*");
    
    xaml = Application.Current.LoadRootVisual(new UserControl(), 'app.xaml')
    
    xaml.TextBlock1.MouseLeftButtonUp += function (sender, args) {
        sender.FontSize *= 2
    }
    
    

    py

    from System.Windows import Application
    from System.Windows.Controls import UserControl
    
    def OnClick (sender, args):
        sender.FontSize *= 2
    
    scene = Application.Current.LoadRootVisual(UserControl(), 'app.xaml')
    scene.TextBlock1.MouseLeftButtonUp += OnClick
    
    

    rb

    include System::Windows
    include System::Windows::Controls
    
    scene = Application.current.load_root_visual UserControl.new, 'app.xaml'
    
    scene.find_name('TextBlock1').mouse_left_button_up do |sender, args|
       sender.font_size = sender.font_size * 2
    end
    
    

    代码调用了LoadRootVisual(DependencyObject, Uri)方法,来设置一个根可视对象,你必须提供一个正确类型的对象,DLR会确保调用了正确的重载方法,并且提供所需的代码上下文。

    使用本文一开始的“查看源码”按钮,得到一个定义了App类的更复杂的例子。

    在随Visual Studio 2008之Silverlight工具Beta 1版本发布的IronRuby版本中,对每个给定的事件(例如MouseLeftButtonUp)只能连接一个事件处理函数。关于语言开发和更新版的详情,请参考Codeplex网站

  5. 在你的应用文件中,创建一个HTML页面来启动你的应用。使用“查询源码”按钮,拷贝为所有三门语言所用的Default.html文件。如果你遵循了本步骤中的命名约定,不做任何改动,你就可以使用这个Default.html文件。

    Default.html 中最重要的一行是指定了app.xap 文件的这一行,该文件包含你的源代码和DLR程序集。

        <object data="data:application/x-silverlight," 
          type="application/x-silverlight-2-b1" 
          width="100%" height="100%">
          <param name="source" value="app.xap"/>

    Default.html还有另外的特性,包括在你调试你的应用时,一个用以显示错误信息的<div>。

  6. 如果你以前没用过Chiron.exe ,将它的路径加到路径环境变量中。

    Chiron.exe位于SDK安装的Tools文件夹之中。如果你使用了默认的安装路径,这个文件夹在\Program Files\Microsoft SDKs\Silverlight\v2.0\Tools。

  7. 要运行你的应用,使用命令行窗口,以/browser (/b)选项运行Chiron.exe。从应用文件中运行Chiron.exe。

    Chiron.exe 将你的应用文件夹中的内容提供给浏览器。

    在默认情形下,Chiron.exe使用“app”作为包含你的入口代码的文件夹,你可以使用/directory (/d)来改变这个默认选项。

    Chiron.exe 会一直在命令行窗口中运行,显示状态消息。

  8. 在浏览器中,点击Default.html来运行应用。

    Chiron.exe 会按需生成.xap文件。你的Silverlight的应用就会打开,点击其中的文字就会增加字体大小。将浏览器开着。

  9. 为表示.xap文件确实是按需生成的,编辑源码文件。改动增加字体大小的那行代码,将它变成减小透明度:

    jsx

    sender.Opacity /= 2
    
    

    py

    sender.Opacity /= 2
    
    

    rb

    sender.opacity = sender.opacity / 2
    
    
  10. 在浏览器中,刷新网页。

    Default.html请求app.xap,Chiron.exe会生成一个新的app.xap文件。应用会重启,点击控件,注意文字的透明度现在会减小。 你可以使用这个技术反复编辑和测试你的应用,而不用重启Chiron.exe。在后面的一个步骤中,你将看到在用Visual Studio调试时,如何进行同类的迭代开发。

  11. 关闭浏览器。

  12. 在命令行窗口中,按CTRL+C中止Chiron.exe。

创建一个.xap部署文件

要部署你的应用,你必须创建一个.xap文件,内含你的动态语言源码,manifest,XAML,以及象位图,语言编辑器,和DLR程序集等资源。Chiron.exe能做此功能。

创建.xap文件

  1. 使用命令行窗口,使用 /directory (/d) 和 /zipdlr (/z)选项运行Chiron.exe。从应用的文件夹中运行Chiron.exe ,就象你在开发和测试应用时做的那样。

    /directory 选项指定了包含应用入口点的目录,而/zipdlr 选项指定了.xap文件的名称。对在上面开发的应用,所用的命令看上去象这样:

    Chiron.exe /directory:app /zipdlr:app.xap
  2. 把Copy Default.html和app.xap拷贝到想要的地点去。

Chiron.exe有个命令行帮助,列出了所有的选项,或者你也可以在Chiron.exe同个文件夹中的Readme.txt文件中找到列出的这些选项。Readme.txt 文件还包含了如何配置Chiron.exe 来使用其他动态语言的信息。

访问类库

要编写基于Silverlight的应用,你需要访问Silverlight类库,加上任何你想用的其他基于Silverlight的类库。在默认情形下,DLR提供了对下列程序集的引用:

  • mscorlib.dll

  • System.dll

  • System.Windows.dll

  • System.Windows.Browser.dll

  • System.Net.dll

 

对这些程序集,你可以略过添加程序集引用的步骤。你还可以访问DLR程序集,Microsoft.Scripting.dll 和 Microsoft.Scripting.Silverlight.dll。你不用导入Microsoft.Scripting.Silverlight 命名空间。

从IronPython中访问基于Silverlight的类库

  1. 使用import语句装载clr模块

    import clr
  2. 使用clr.AddReference函数装载程序集,使它们的内容可作import之用

    clr.AddReference("MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089")
  3. 使用import语句,向当前的上下文添加命名空间或装载模板。 你必须在使用命名空间前先将它们导入

    import System.Windows
    import System
    import MyPythonModule
  4. 使用from … import语句将一个命名空间或模板的内容加到当前上下文

    from System.Windows import *
    from System.Windows.Controls import UserControl*

     

从托管JScript中访问基于Silverlight的类库

  1. 使用AddReference函数装载程序集,使它们的内容可作导入之用

    AddReference("MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089")
  2. 使用Import函数把命名空间导入到当前上下文,你必须在使用命名空间前先将它们导入

    Import("System.Windows")
    Import("System")
  3. 使用Import函数将一个命名空间的内容导入到当前上下文

    Import("System.Windows.*")
    Import("System.*")

    除了搞乱全局上下文外,加入System中的所有类型还会把托管JScript的Array类型替换成System.Array,你也可以导入特定的类型。

  4. 使用ImportAlias函数以别名将一个命名空间或类型导入到当前上下文中

    SW = ImportAlias("System.Windows")
  5. 使用LoadModule和LoadModuleFromFile函数装载模板,这些方法返回装载的模板,LoadModuleFromFile的第二个参数指定了模板的类型,"js" 或 "py"

    util = LoadModule("MyUtilities")
    util = LoadModuleFromFile("MyUtilities", "py")

     

从IronRuby中访问基于Silverlight的类库

  1. 使用require语句装载程序集,使它们的内容可作包含之用

    require MyAssembly
  2. 使用include 语句将命名空间加到当前上下文

    include System.Windows
    

使用Chiron.exe和Visual Studio调试基于Silverlight的应用

在Visual Studio 2008之Silverlight工具Beta 1版本中,你可以使用Visual Studio 2008来调试用了动态语言的基于Silverlight应用。你的基于 Silverlight的应用必须下载到浏览器里才能运行,调试器必须在代码下载后才能启动。你可以在调试外改动你的代码,重新装载代码而不用重新连接浏览器进程。

调试动态语言应用

  1. 把你要调试的动态语言文件装载进Visual Studio,设置断点

  2. 从应用文件夹中,以/browser (/b)选项运行Chiron.exe,将目录内容提供给浏览器

  3. 在浏览器中,点击Default.html启动应用

    Chiron.exe会按需生成.xap文件,应用的启动代码将运行

  4. 在Visual Studio中,在Debug菜单上,点击Attach to Process(连接到进程)

    因为你的应用是在浏览器中运行的,你必须连接到浏览器进程中才能调试

  5. 在Attach to Process对话框中,在Available Processes列表中,在Process一列,点击选择适当的浏览器实例

    如果你有打开着的其他的浏览器实例,给Default.html一个标题,使之可从Title一列中易于识别

  6. 点击Attach.

  7. 转到浏览器,点击F5刷新Default.html

    你的应用将在调试器中重新装载,你现在就可以开始调试了。你在起始代码中设置的任何断点就会在应用重新装载时触发。

    重要注意事项

    你必须在连接打调试器之后,刷新页面,重载你的应用。如果你没有先刷新页面,就开始与你的应用做交互,你的断点一个也不会被触发的。

  8. 使用第二个 Visual Studio实例或另一个编辑器,对你的代码做改动,然后将其保存。

    你不能在连接到浏览器进程的Visual Studio实例中对代码做改动。【译注:好像是可以的】

  9. 在浏览器中,刷新你的HTML页面

    Chiron.exe会生成一个新的.xap文件,你的应用的起始代码会运行。如果你在起始代码中有断点,它们就会被触发。

  10. Visual Studio会告诉你源码文件被作了改动,询问是否要重新装载。点击Yes,重新装载文件,继续你的Visual Studio调试会话。

     

    如果你在另外的编辑器里保存你的改动时,你的Visual Studio调试会话正处于一个断点在单步调试进代码时,你无法转换到浏览器。而是转到你的Visual Studio调试会话,你会被询问是否要重新装载源码文件。然后你必须刷新浏览器。

    你可以继承在调试和改动代码之间转换,而不用中止浏览器或Chiron.exe。

  11. 调试完毕后,脱离进程。关闭浏览器,使用CTRL+C 中止Chiron.exe。

     

调试特性的状况

包含在Visual Studio 2008之Silverlight工具Beta 1版本中的 DLR和动态语言快照支持大多数的调试特性。例如,你可以使用F10和F11跳过或步入代码。使用 Locals 窗口查看变量数值,以及在Immediate窗口中设置变量数值或执行代码。

在IronPython中,但你使用F10,超过函数的结尾,控制返回到浏览器时,Visual Studio 2008会显示一个对话框告诉你没有可用的源代码。点击OK关闭对话框,然后点击F5继续。

一些语言中的支持会比另外一些语言中的好。调试支持将会随语言的开发继续扩充。欲知最新的信息,请访问Codeplex网站