由MVP王少葵主持翻译的《C#与.NET 3.0高级程序设计(特别版) 》(人民邮电出版社)终于出版了,我参与了其中第六部分的翻译。
原作者 Andrew W. Troelsen,微软MVP,是个多产作者,在微软平台技术,尤其是.NET方面有很深的造诣。该书的早期版本曾入围2002年Jolt大奖的最后提名,并获得2003年Referenceware编程图书类的Excellence Award。
原书中来自Slashdot的评论:
“本书极为全面、细致深入地探讨了C#与.NET 2.0框架的各种特性。其中对CIL的介绍和运用尤为精彩,超过了任何其他文章和图书。绝对值得拥有。”
Mr.“IronRuby” John Lam 在他的博客上登出了三篇贴子,其内容是他在MIX08大会上做的讲座的文字版
Microsoft Silverlight and Dynamic Languages
http://visitmix.com/blogs/2008Sessions/T28/
讲座录像的MP4版: http://msstudios.vo.llnwd.net/o21/mix08/08_MP4s/T28.mp4 (57.6MB)
讲座录像的WMV版: http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T28.wmv (84.1MB)
演示代码可以在这里下载:
http://dynamicsilverlight.net/
在第一篇《Dynamic Silverlight Part 1: Hello, World! in Dynamic Silverlight 》中,主要介绍随Silverlight 2 Beta 1一起发布的Chiron.exe命令行工具。这个工具有2大主要功能,一是可以帮你把应用的文件,资源,程序集等转换压制成.xap文件,二是提供一个简单的web服务器的功能,让你使用文件系统就能开发Silverlight应用。由于Chiron是动态生成.xap文件的,你对文件做变动后,只要刷新浏览器就可以获得新的.xap文件,不用重启Chiron或浏览器,提供了很好的交互开发体验。
在第二篇《Dynamic Silverlight Part 2: Managed JScript and flickr 》中,示范了如何使用托管的JScript (与我们在浏览器中的客户端Javascript不同) 与Flickr API做交互,让用户查询相关主题的照片,并将照片显示在Silverlight中。还演示了在Silverlight中,原封不动地使用Peter Norvig(AI大师)用Python编写的Spelling Corrector (拼写纠错器),提示用户输入的主题可能有错。
在第三篇《Dynamic Silverlight Part 3: Integrating Silverlight with ASP.NET MVC 》中,示范了如何与ASP.NET MVC应用做集成。通过Chiron生成.xap文件,用IronRuby在客户端动态生成WPF元素,使用WebClient与服务器端做交互等。
【原文地址】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下载网站 获取):
用动态语言创建基于Silverlight的应用 一个使用动态语言的基于Silverlight的简单应用包括下列组成部分:
根目录的HTML或.aspx文件,作为浏览器的入口点
app.xaml文件,定义了你的基于Siliverlight应用的用户界面
app.py, app.rb, 或app.jsx 文件,内含在运行时处理事件的动态语言代码。对动态语言来说,这个文件是不被编译成一个程序集的,动态语言的代码是在运行时在客户端计算机上编译和执行的
注 动态语言引擎和DLR程序集是包含在由Chiron.exe 生成的.xap 文件中,并下载到客户端计算机的。你不需要在你的项目中包含它们。
使用动态语言创建和运行基于Silverlight的应用 为你的应用创建一个文件夹.
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所用,不用指定任何特别参数的基本的结构。你的应用程序可以访问任意复杂的文件夹结构,可以包含任意数目的动态语言代码文件。
在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的例子。
在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网站 。
在你的应用文件中,创建一个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>。
如果你以前没用过Chiron.exe ,将它的路径加到路径环境变量中。
Chiron.exe位于SDK安装的Tools文件夹之中。如果你使用了默认的安装路径,这个文件夹在\Program Files\Microsoft SDKs\Silverlight\v2.0\Tools。
要运行你的应用,使用命令行窗口,以/browser (/b)选项运行Chiron.exe。从应用文件中运行Chiron.exe。
Chiron.exe 将你的应用文件夹中的内容提供给浏览器。
注
在默认情形下,Chiron.exe使用“app”作为包含你的入口代码的文件夹,你可以使用/directory (/d)来改变这个默认选项。
Chiron.exe 会一直在命令行窗口中运行,显示状态消息。
在浏览器中,点击Default.html来运行应用。
Chiron.exe 会按需生成.xap文件。你的Silverlight的应用就会打开,点击其中的文字就会增加字体大小。将浏览器开着。
为表示.xap文件确实是按需生成的,编辑源码文件。改动增加字体大小的那行代码,将它变成减小透明度:
jsx
py
rb
sender.opacity = sender.opacity / 2
在浏览器中,刷新网页。
Default.html请求app.xap,Chiron.exe会生成一个新的app.xap文件。应用会重启,点击控件,注意文字的透明度现在会减小。 你可以使用这个技术反复编辑和测试你的应用,而不用重启Chiron.exe。在后面的一个步骤中,你将看到在用Visual Studio调试时,如何进行同类的迭代开发。
关闭浏览器。
在命令行窗口中,按CTRL+C中止Chiron.exe。
创建一个.xap部署文件
要部署你的应用,你必须创建一个.xap文件,内含你的动态语言源码,manifest,XAML,以及象位图,语言编辑器,和DLR程序集等资源。Chiron.exe能做此功能。
创建.xap文件
使用命令行窗口,使用 /directory (/d) 和 /zipdlr (/z)选项运行Chiron.exe。从应用的文件夹中运行Chiron.exe ,就象你在开发和测试应用时做的那样。
/directory 选项指定了包含应用入口点的目录,而/zipdlr 选项指定了.xap文件的名称。对在上面开发的应用,所用的命令看上去象这样:
Chiron.exe /directory:app /zipdlr:app.xap
把Copy Default.html和app.xap拷贝到想要的地点去。
注
Chiron.exe有个命令行帮助,列出了所有的选项,或者你也可以在Chiron.exe同个文件夹中的Readme.txt文件中找到列出的这些选项。Readme.txt 文件还包含了如何配置Chiron.exe 来使用其他动态语言的信息。
访问类库
要编写基于Silverlight的应用,你需要访问Silverlight类库,加上任何你想用的其他基于Silverlight的类库。在默认情形下,DLR提供了对下列程序集的引用:
对这些程序集,你可以略过添加程序集引用的步骤。你还可以访问DLR程序集,Microsoft.Scripting.dll 和 Microsoft.Scripting.Silverlight.dll。你不用导入Microsoft.Scripting.Silverlight 命名空间。
从IronPython中访问基于Silverlight的类库
使用import语句装载 clr模块
使用clr.AddReference函数装载程序集,使它们的内容可作import之用
clr.AddReference("MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089")
使用import语句,向当前的上下文添加命名空间或装载模板。 你必须在使用命名空间前先将它们导入
import System.Windows
import System
import MyPythonModule
使用from … import语句将一个命名空间或模板的内容加到当前上下文
from System.Windows import *
from System.Windows.Controls import UserControl*
从托管JScript中访问基于Silverlight的类库
使用AddReference 函数装载程序集,使它们的内容可作导入之用
AddReference("MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089")
使用Import函数把命名空间导入到当前上下文,你必须在使用命名空间前先将它们导入
Import("System.Windows")
Import("System")
使用Import函数将一个命名空间的内容导入到当前上下文
Import("System.Windows.*")
Import("System.*")
注
除了搞乱全局上下文外,加入System中的所有类型还会把托管JScript的Array类型替换成System.Array,你也可以导入特定的类型。
使用ImportAlias函数以别名将一个命名空间或类型导入到当前上下文中
SW = ImportAlias("System.Windows")
使用LoadModule和 LoadModuleFromFile函数装载模板,这些方法返回装载的模板,LoadModuleFromFile的 第二个参数指定了模板的类型,"js" 或 "py"
util = LoadModule("MyUtilities")
util = LoadModuleFromFile("MyUtilities", "py")
从IronRuby中访问基于Silverlight的类库
使用require语句装载程序集,使它们的内容可作包含之用
使用include 语句将命名空间加到当前上下文
使用Chiron.exe和Visual Studio调试基于Silverlight的应用
在Visual Studio 2008之Silverlight工具Beta 1版本中,你可以使用Visual Studio 2008来调试用了动态语言的基于Silverlight应用。你的基于 Silverlight的应用必须下载到浏览器里才能运行,调试器必须在代码下载后才能启动。你可以在调试外改动你的代码,重新装载代码而不用重新连接浏览器进程。
调试动态语言应用
把你要调试的动态语言文件装载进Visual Studio,设置断点
从应用文件夹中,以/browser (/b)选项运行Chiron.exe,将目录内容提供给浏览器
在浏览器中,点击Default.html启动应用
Chiron.exe会按需生成.xap文件,应用的启动代码将运行
在Visual Studio中,在Debug菜单上,点击 Attach to Process(连接到进程)
因为你的应用是在浏览器中运行的,你必须连接到浏览器进程中才能调试
在Attach to Process对话框中,在 Available Processes列表中,在 Process一列,点击选择适当的浏览器实例
如果你有打开着的其他的浏览器实例,给Default.html一个标题,使之可从Title一列中易于识别
点击Attach .
转到浏览器,点击F5刷新Default.html
你的应用将在调试器中重新装载,你现在就可以开始调试了。你在起始代码中设置的任何断点就会在应用重新装载时触发。
重要注意事项
你必须在连接打调试器之后,刷新页面,重载你的应用。如果你没有先刷新页面,就开始与你的应用做交互,你的断点一个也不会被触发的。
使用第二个 Visual Studio实例或另一个编辑器,对你的代码做改动,然后将其保存。
你不能在连接到浏览器进程的Visual Studio实例中对代码做改动。【译注:好像是可以的】
在浏览器中,刷新你的HTML页面
Chiron.exe会生成一个新的.xap文件,你的应用的起始代码会运行。如果你在起始代码中有断点,它们就会被触发。
Visual Studio会告诉你源码文件被作了改动,询问是否要重新装载。点击Yes,重新装载文件,继续你的Visual Studio调试会话。
注 如果你在另外的编辑器里保存你的改动时,你的Visual Studio调试会话正处于一个断点在单步调试进代码时,你无法转换到浏览器。而是转到你的Visual Studio调试会话,你会被询问是否要重新装载源码文件。然后你必须刷新浏览器。
你可以继承在调试和改动代码之间转换,而不用中止浏览器或Chiron.exe。
调试完毕后,脱离进程。关闭浏览器,使用CTRL+C 中止Chiron.exe。
调试特性的状况
包含在Visual Studio 2008之Silverlight工具Beta 1版本中的 DLR和动态语言快照支持大多数的调试特性。例如,你可以使用F10和F11跳过或步入代码。使用 Locals 窗口查看变量数值,以及在Immediate窗口中设置变量数值或执行代码。
注
在IronPython中,但你使用F10,超过函数的结尾,控制返回到浏览器时,Visual Studio 2008会显示一个对话框告诉你没有可用的源代码。点击OK关闭对话框,然后点击F5继续。
一些语言中的支持会比另外一些语言中的好。调试支持将会随语言的开发继续扩充。欲知最新的信息,请访问Codeplex网站 。
已经可以直接观看或下载了:
http://sessions.visitmix.com/
Luciano Evaristo Guerche先生在博客里列出了一些录像的直接链接:
Mix 2008, 65 presentations so far (WMV direct links)http://weblogs.asp.net/guerchele/archive/2008/03/07/mix-2008-65-presentations-so-far-wmv-direct-links.aspx
跟Silverlight有关的录像,
Keynote I (第一天的主题演讲) Dean Hachamovitch, Ray Ozzie, Scott Guthriehttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/KYN0801.wmv Building AOL's High Performance, Enterprise Wide Mail Application With Silverlight 2 Eric Hoffman, Marc Katchay, Stefan Galhttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/BT01.wmv
Building Rich Internet Applications Using Microsoft Silverlight 2, Part 1 Joe Stegman, Mike Harsh http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/CT01.wmv Building Rich Internet Applications Using Microsoft Silverlight 2, Part 2 Joe Stegman, Mike Harsh http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/CT02.wmv Creating Rich, Dynamic User Interfaces with Silverlight 2 Karen Corby http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T20.wmv Encoding Video for Microsoft Silverlight Ben Waggonerhttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/BCT07.wmv Exploring Moonlight: Novell's Implementation of Silverlight on Linux Miguel de Icaza http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T31.wmv From Flash to Silverlight: A Rosetta Stone Rick Barazzahttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T30.wmv Integrating Media in Silverlight Applications Ed Maiahttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/BCT05.wmv Internationalizing XAML Applications in Windows Presentation Foundation and Microsoft Silverlight Ken Azuma, Laurence Moroney, Ted Kitamura http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T15.wmv Mobile Devices and Microsoft Silverlight: A Primer on the New Technology Amit Chopra, David Klinehttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T12.wmv Real World Design: Working with Silverlight and WPF in the Design Studio Beau Ambur, Chip Aubry, Chris Bernard, Nathan Dunlap, Rich Westonhttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/PNL16.wmv Silverlight and Advertising Eric Schmidthttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/BT06.wmv Silverlight as a Gaming Platform Joel Neubeck, Scott McAndrew http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/CT03.wmv The Business of Microsoft Silverlight Danny Riddellhttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/B01.wmv Using Microsoft Silverlight for Creating Rich Mobile User Experiences Giorgio Sardohttp://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/C02.wmv Working with Data and Web Services in Microsoft Silverlight 2 Eugene Osovetsky http://msstudios.vo.llnwd.net/o21/mix08/08_WMVs/T13.wmv
功能
Silverlight 1.0
Silverlight 2 Beta 1
2D 矢量动画/图形
AJAX 支持
跨浏览器 (Firefox, IE, Safari)
跨平台 (Windows, Mac)
框架语言
(Visual Basic, Visual C#, IronRuby, Ironpython)
-
HTML DOM 集成
HTTP Networking
隔离存储(Isolated Storage)
-
JavaScript支持
JSON, REST, SOAP/WS-*, POX, 和RSS Web Services (以及对Sockets的支持)
-
跨域网络访问
-
LINQ to Objects
-
Canvas布局支持
StackPanel, Grid 和 Panel布局支持
-
托管的控件框架
-
整套控件(TextBox, RadioButton, Slider, Calendar, DatePicker, DataGrid, ListBox等等)
-
Deep Zoom 技术
-
托管的HTML桥
-
托管的异常处理
-
媒体 – 内容保护
-
媒体 – 720P 高清晰 (HD) 视频
媒体 – 音频/视频支持 (VC-1, WMV,
WMA, MP3)
媒体 – 图像支持 (JPG, PNG)
媒体记号
丰富的核心框架(例如泛型,集合等)
-
安全执行
-
Silverlight ASP.NET 控件
(asp:media, asp:xaml)
类型安全确认
-
Windows Meda Server支持
XAML Parser (基于WPF)
XMLReader/Writer
-
IE8带来了一堆改进和新功能,这些改进包括CSS 2.1 兼容,开发者工具,更好的AJAX开发支持等,详见
How do I make my site 'light up' with Internet Explorer 8?
http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/DevelopersNew.htm
比较关心的是涉及AJAX开发的,更为详细的文档在这里
Better AJAX Development
http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=ie8whitepapers&ReleaseId=581
这些改进包括:
1.AJAX导航支持(前进,倒退按钮工作了!)
2.DOM储存(简洁的API,每个域可在本地保存10M的数据)
3.网络连接事件(online以及offline事件,还可以通过window.navigator.onLine来监测连接状态)
4.把per host的并发连接数从2增加到6
5.XMLHTTPRequest改进,包括添置了timeout属性,以及ontimeout事件,以允许开发人员中止请求
更为激动人心的是对跨域请求(XDomainRequest-XDR)的支持!不再需要通过同源服务器来作为代理服务器,只要异域返回 XDomainRequestAllowed=1的header就可以(譬如通过Response.AppendHeader("XDomainRequestAllowed","1") ):
// 1. Create XDR object
xdr = new XDomainRequest();
// 2. Open connection with server using POST method.
xdr.open("POST", "http://www.contoso.com/xdr.txt")
// 3. Send string data to server.
xdr.send("data to be processed")
以前曾在博客里谈到如何通过URL的hash来在来自不同域的网页之间通讯,绝对是比较丑陋的方案:
http://blog.joycode.com/saucer/archive/2006/10/03/84572.aspx
IE8现在支持跨文件消息通讯(Cross-Document Messaging-XDM)!通过onmessage事件和postMessage方法,两个来自不同域的网页可以进行通讯:
窗口A:(来自contoso.com)
// 1. Create event handler for message event.
<document.onmessage = HandleMsg()>
// 2. Post message to a secure page B.
window.postMessage("Hello world", "https://lucernepublishing.com")
窗口B:(来自lucernepublishing.com)
// 3. Create event handler for message event.
<document.onmessage = HandleMsg()>
// 4. Create event object off window.
var e = window.event
// 5. Check domain on received event to ensure the message
// comes from the expected domain.
if (e.domain = "contoso.com")
if (e.scheme = "HTTPS")
// 6. Retrieve data from event.
var data = e.data
// 7. Send return message to Page A.
e.source.postMessage("Hello")