用 Chiron 运行 IronPython 编写的 Silverlight 程序
Silverlight Dynamic Languages SDK 目前 host 在 CodePlex 上,使用它可以用 IronPython/IronRuby/Managed JScript 等动态语言编写 Silverlight 程序,其项目的主页在:
http://www.codeplex.com/sdlsdk
我做了一些尝试,发现要实际用来开发点东西,还是有不少需要注意的地方,特别是程序集引用的问题。故记录与此,以供参考。
假设程序的目录组织结构如下(根据 Silverlight Dynamic Languages SDK 里的例子):
\python\ 这里存放所有 .py 和 .xaml 程序
\javascripts\
\stylesheets\
\index.html
index.html 文件中包含 Silverlight 插件,指向 python 目录打包生成的 xap 文件 python.xap.
在这样的前提下,有下列几个方法运行程序:
一、打包后静态方式运行 html 文件
先执行命令:
chiron /z:python.xap /d:python
这个命令所做的事情:
1. 压缩 python 目录下的所有文件到 python.xap 这个包中。
2. 除此之外,在包中还包含一个 AppManifest.xaml 文件,其中的 AssemblyPart 引用来自
chron.exe.config 文件里的 <AppManifest.xaml> 节中的定义。所以,如果需要在运行这个压缩命令时,
打包进去额外的程序集,需要做两件事:a. 将程序集复制到 python 目录下,b. 如上所述在
chiron.exe.config 文件里增加相关程序集声明。
通过这种方式生成的 xap 文件可以直接被 html 文件引用,在不需要 chiron 的情况下直接打开执行。
二、通过 Chiron.exe 直接动态生成 xap 文件执行
1. 在 Chiron.exe.config 里增加相关引用程序集的声明
2. 在 python 目录下/或 chiron.exe 所在的同一个目录下增加要引用的程序集 dll 文件。
3. 执行 chiron.exe /b:index.html
这种情况下:
a. 如果更新了引用的程序集,只需将其复制到 python 目录下覆盖即可,然后刷新页面即可看到效果。
b. 如果需要增加对其他程序集的引用,除了a的步骤,还要在 chiron.exe.config 里增加一项,并重新启动
chiron web服务器才能看到效果。
注意点:
在 python 中添加引用时必须这样写:
如果程序集不能加载,则使用下列语句可以得到更为详细的信息:
clr.LoadAssemblyByName("TestLib")
奇怪的是,对于 System.Windows.Controls.Data.dll 这个 dll,不需要写出程序集的全名,用下列简略的名
称即可引用到:
clr.AddReference("System.Windows.Controls.Data")
估计对 Silverlight sdk 里的 dll 都是如此,这一点我还没有验证。
另外提一下,因为官方提供的例子都是一个简单的 .py 或者 .rb 文件加载 xaml 的场景,我做了一个简单的架构,可以实现类似 C# 那样的 Code behind 方式模块化开发 Silverlight 程序,参考这里:
http://www.cnblogs.com/RChen/archive/2008/08/01/1258011.html
使用 IronPython 开发最大的好处就是快速开发,快速测试,不需要 VS 漫长的编译过程,修改代码后直接刷新浏览器就能看到效果,如果你还没有尝试过这样的体验,不妨试试吧,感觉很好的。
http://www.codeplex.com/sdlsdk
我做了一些尝试,发现要实际用来开发点东西,还是有不少需要注意的地方,特别是程序集引用的问题。故记录与此,以供参考。
假设程序的目录组织结构如下(根据 Silverlight Dynamic Languages SDK 里的例子):
\python\ 这里存放所有 .py 和 .xaml 程序
\javascripts\
\stylesheets\
\index.html
index.html 文件中包含 Silverlight 插件,指向 python 目录打包生成的 xap 文件 python.xap.
在这样的前提下,有下列几个方法运行程序:
一、打包后静态方式运行 html 文件
先执行命令:
chiron /z:python.xap /d:python
这个命令所做的事情:
1. 压缩 python 目录下的所有文件到 python.xap 这个包中。
2. 除此之外,在包中还包含一个 AppManifest.xaml 文件,其中的 AssemblyPart 引用来自
chron.exe.config 文件里的 <AppManifest.xaml> 节中的定义。所以,如果需要在运行这个压缩命令时,
打包进去额外的程序集,需要做两件事:a. 将程序集复制到 python 目录下,b. 如上所述在
chiron.exe.config 文件里增加相关程序集声明。
通过这种方式生成的 xap 文件可以直接被 html 文件引用,在不需要 chiron 的情况下直接打开执行。
二、通过 Chiron.exe 直接动态生成 xap 文件执行
1. 在 Chiron.exe.config 里增加相关引用程序集的声明
2. 在 python 目录下/或 chiron.exe 所在的同一个目录下增加要引用的程序集 dll 文件。
3. 执行 chiron.exe /b:index.html
这种情况下:
a. 如果更新了引用的程序集,只需将其复制到 python 目录下覆盖即可,然后刷新页面即可看到效果。
b. 如果需要增加对其他程序集的引用,除了a的步骤,还要在 chiron.exe.config 里增加一项,并重新启动
chiron web服务器才能看到效果。
注意点:
在 python 中添加引用时必须这样写:
import clr
# 这里如果写 clr.AddReference("TestLib") 则会报错,这是 Silverlight 的一个已知的问题。
clr.AddReference("TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
from TestLib import Class1
# 这里如果写 clr.AddReference("TestLib") 则会报错,这是 Silverlight 的一个已知的问题。
clr.AddReference("TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
from TestLib import Class1
如果程序集不能加载,则使用下列语句可以得到更为详细的信息:
clr.LoadAssemblyByName("TestLib")
奇怪的是,对于 System.Windows.Controls.Data.dll 这个 dll,不需要写出程序集的全名,用下列简略的名
称即可引用到:
clr.AddReference("System.Windows.Controls.Data")
估计对 Silverlight sdk 里的 dll 都是如此,这一点我还没有验证。
另外提一下,因为官方提供的例子都是一个简单的 .py 或者 .rb 文件加载 xaml 的场景,我做了一个简单的架构,可以实现类似 C# 那样的 Code behind 方式模块化开发 Silverlight 程序,参考这里:
http://www.cnblogs.com/RChen/archive/2008/08/01/1258011.html
使用 IronPython 开发最大的好处就是快速开发,快速测试,不需要 VS 漫长的编译过程,修改代码后直接刷新浏览器就能看到效果,如果你还没有尝试过这样的体验,不妨试试吧,感觉很好的。