让Silverlight开发更便捷——Silverlight工具集

CodePlex.com作为微软的开源社区,已经有越来越多的开发人员从中找到自己想要的东西(亦或代码示例,亦或实用工具)来帮助开发。同时,在微软内部,也有越来越多的开发团队选择了这种更轻量便捷的方式来发布一些有趣、实用却暂时无法放入品中的代码和工具。在前几篇博文中,我也介绍了上海开发团队负责维护的codeplex主页(http://www.codeplex.com/clrinterop),以及已经发布的一些有关interop的小工具。今天来介绍一个辅助Silverlight程序开发的codeplex主页——Silverlight工具集(Silverlight Toolkit)。它不是由上海团队负责维护的,但对Silverlight开发人员来说却非常实用。其名字也非常好记:http://www.codeplex.com/silverlight。 Silverlight工具集在正常的Silverlight发布周期之外,为Silverlight的开发设计人员提供了一系列控件、组件、一些功能的改进和其它实用内容。目前最新的版本所包含的内容包括树形控件(TreeView),自动完成输入框控件(AutoCompleteBox),输入框中的数字加减控件(NumericUpDown),展开控件(Expander),隐式样式管理器(ImplicitStyleManager),新的主题(Theme),图表等等。 来看下效果图: 最后祝大家圣诞快乐~  :)

1

.NET框架4.0中都有些什么?

前不久,在美国洛杉矶召开的Professional Developer Conference(PDC)上有一个讲座,介绍了有关.NET框架4.0中在CLR(公共语言运行时)方面的新功能。完整的视频可以在这里找到。这里做一个简单的总结: .NET 4.0让不同组件之间工作的更好 1. 兼容性一直是个令人很头疼的问题,在.NET 4.0中,在同一个进程中,不同运行时上的组件可以同时运行,我们称之为In process Side by Side。  2. 对于很多同时包含COM组件和托管代码的应用程序,Primary Interop Assembly (PIA) 一直程序在部署方面令人很头疼的问题。现在,.NET 4.0中加入了称为NO-PIA的新功能,使得Interop的版本类型匹配仅通过简单的属性(TypeIdentifierAttribute)和GUID就能实现,免去了繁杂的PIA部署,也减少了应用程序的部署大小。 3. P/Invoke Interop Assistant,是一个能帮助使用Interop的开发人员快速转换C语言与.NET语言方法签名的工具,在http://www.codeplex.com/clrinterop 的网站上可以免费下载到。 4. 此外,.NET 4.0也为引入动态语言与功能性语言做了相应的改进。包括一些新类型,如BigIntegers,Tuples,并对Tail recursion 的情况作了优化。   .NET 4.0在性能上做了进一步的提高 1. .NET 4.0提高了并行计算的线程性能。 2. .NET 4.0中加入了后台垃圾回收功能(Background GC),使得垃圾回收时发生的延迟现象明显减少。 3. 此外,对于Profiler,.NET 4.0中的Profiler提供更好的CPU采样功能,实时的堆分析和对象引用图表。   .NET 4.0帮助开发人员减少程序中的bug 1. .NET 4.0支持dump debugging,可以提供重现crash的信息,使开发人员对crash的情况的调试更有效。 2. .NET 4.0支持64位的混合模式调试,使得托管代码和非托管代码之间的调试更方便。 3. .NET 4.0提供Code…

2

CodePlex开源版Tlbimp.exe的两个新功能

昨天,我们开发团队在CodePlex上发布了一个Tlbimp的新版本。关于Tlbimp的用途介绍这里就不多说了,大家有兴趣的话可以参看半个月前写的《Tlbimp.exe在CodePlex上开源啦!》一文。半个月后,我们根据用户最迫切的需求,给Tlbimp的功能作了小小的改进,并将这个最新版本再次发布在CodePlex上。主要的新功能包含了两个新的选项: /v2:当用户在命令行中输入 >tlbimp.exe Foo.tlb /v2 开启/v2选项时,Tlbimp将会使用最新的规则来转换类型库。新的规则大多解决了老版本Tlbimp因为技术限制而对类型库进行的转换不够正确的问题。不直接应用这些新规则,主要是考虑到兼容性的问题,但我们建议用户能够尽量使用新的规则,以使生成的interop assembly尽可能正确,减少后续为得到正确行为而增加的开发开销。在这个版本中加入的一个新的规则是将类型库的struct中的VARIANT_BOOL转换成bool类型。而不用/v2,Tlbimp将按照老版本的规则,将VARIANT_BOOL转换成short。 /PreserveSig:使用这个选项,Tlbimp将不会把标有[out, retval]参数类型转换成返回值,而是保留其参数性质,并为方法添加PreserveSig属性。 最新版的开源Tlbimp可以在其网站上下载到。如果大家有什么问题、建议,也可以通过该网站向我们提出。

0

Microsoft Silverlight 2正式版发布!

在Silverlight 1.0发布的一年之后,今天,太平洋标准时间的午夜,北京时间的下午,Silverlight 2的正式版终于发布了!Silverlight作为一种网络技术,为用户带来下一代互联网络的丰富体验,为网络应用开发商以及其客户带来双重价值。配合Silverlight技术,微软提供的一系列工具让用户可以更快更方便的开发出跨设备跨平台跨浏览器的丰富的网络应用程序,并使应用程序的扩展性、可靠性、性能、安全性等受到一定的保障。由于这些工具重用了微软已有的工具和技术,使换置工具、更新技术的成本大幅度降低。而部署的成本以及投入市场的时间也大大减少。总之,只要有网络的地方,就可以享受Silverlight带来的丰富体验,这也是Silverlight的最终目标。 最终发布版的Silverlight 2又添加了新的功能,这些功能旨在从以下几个方面提供更好的用户体验: 为媒体和广告开发商提供高质量的可靠平台来发布内容受保护的、基于广告的丰富媒体体验。结合使用Windows Server 2008、数字版权管理软件以及Expression Studio和Visual Studio,媒体公司能将其媒体内容发布到任何一个网络所能触及的地方。 为网络应用开发商提供快速创建和发布网络浏览器支持的丰富的交互式应用程序。Silverlight完全支持微软已有的开发工具和技术,使快速开发成为可能。 对开发人员而言,Silverlight扩展了开发人员已掌握的技术,从而轻松的开发出新型的网络应用程序而不用担心平台和浏览器的问题。 对设计人员而言,Microsoft Silverlight使设计人员富有创造性的想法在网络和移动设备上充分展现出来。 新的功能主要包括了: .NET框架所支持并兼容的丰富的基类库 功能强大的内建控件,包括DataGrid,ListBox,Slider,ScrollViewer,Calendar等等 高级的皮肤及模版支持 Deep Zoom 广泛的网络支持,包括REST,WS*/SOAP,POX,RSS以及标准HTTP服务,使用户创建的应用能很方便的集成到已有的后端系统中 高级的内容保护,通过Silverlight DRM为内容提供健壮的在线保护 对服务器伸缩性的改进以及对广告商支持的扩展 活跃的合作伙伴支持,包括ComponentOne LLC,Ingragistics以及Telerik等公司为Silverlight开发人员提供的一系列产品能帮助开发人员更快更好的开发出丰富的应用程序 跨平台、跨浏览器的支持,包括Mac,Windows以及Linux操作系统上的FireFox,Safari及IE浏览器 现在就可以去Microsoft Silverlight的官方网站(http://www.microsoft.com/silverlight)下载并使用最新的Silverlight 2,享受互联网带来的丰富体验了。

1

Visual Studio 2010及.NET框架4.0前景瞻望

这是国庆长假以后的第一篇博文。不知道大家这个国庆过得怎么样?近几个月,我们的开发团队一直在进行.NET框架4.0的设计开发,工作正在如火如荼的进行中。就在国庆期间,微软公布了我们在Visual Studio 2010及.NET框架4.0设计开发时的一些理念和规划想法。我想在这里和大家分享一下。 从一个较高的角度来讲,我们在Visual Studio 2010和.NET框架4.0中主要关注以下几个关键领域: ·         显著的改善开发人员在核心领域的开发体验 ·         支持最新的平台,包括客户端、网络、服务器和各类设备 ·         旨在简化开发人员对不同应用程序类型的开发体验 ·         对工具平台进行结构性的改进,以提供更好的调制性和扩展性 以上这些关键领域主要针对在应用程序生命周期中将想法变成产品的开发人员和开发团队所产生的需求,也针对那些要求高质量的、跨多种平台的应用程序的客户而特别设计。 用最简单的一句话来说,我们要在Visual Studio 2010及.NET框架4.0中,提供一种一致而简单的编程体验,而不管所构建的应用程序的类型是什么。 至于Visual Studio 2010及.NET框架4.0中具体有什么新功能,我们会在接下来的几个月中逐一介绍。而部分新的功能,也能在即将发布的Visual Studio 2010 CTP版本中抢先体验到。 不管你对你手上的开发工具和技术有任何的抱怨或者建议,都欢迎在这里留下你的声音。无论怎样,更好的开发体验,始终是我们这几个月以及接下来的几个月中希望努力做得更好的。 : )

6

Tlbimp.exe在Codeplex上开源啦!

这是我们这里的CLR Interop开发团队在开源网站codeplex.com上发布的第二个开源工具了。Tlbimp.exe,经常在COM与托管代码之间做编程开发的开发人员应该会对这个工具比较熟悉。它是一个将COM的type library转换生成托管的程序集(interop assembly),供托管代码进行调用的一个非常实用的工具。生成的Interop assembly中包含了与所转换的COM类型库相对应的元数据,这样托管代码的开发人员就可以把它当成一个普通的托管代码程序集来使用,并用与调用托管类型相同的方式在托管项目中调用COM的类型而不感觉到差异。 由于现有的Tlbimp完成的是从输入到输出的“一步式”工作,内部许多默认的转换或许不能很好的满足所有开发人员的要求。因此,我们将Tlbimp的代码于开发团队在Codeplex上的网站公布,供开发人员阅读和参考。开发人员更可以根据自己的需要修改并扩展代码。而且,这只是我们对开源的Tlbimp发布的第一个版本,其功能和.NET Framework 3.5 SDK中的Tlbimp.exe一致。我们还计划在不久的将来发布第二个版本,提供更多实用的新功能,方便开发人员对输出结果进行定制。如果你有任何的建议,欢迎通过这个blog或者Codeplex网站的留言告诉我们。 现在就点击这里下载Tlbimp的源代码吧!

4

DLR in Silverlight

DLR(Dynamic Language Runtime)是Silverlight中提供的一套非常强大的动态语言运行时。目前2.0 beta2中支持Python,Ruby和JSX。利用DLR,你可以很方便的使用熟悉的动态语言编写Silverlight程序。本文主要介绍如何在托管语言中调用动态语言。 首先,我们需要初始化动态语言的环境配置,从中获取所有可以使用的动态语言列表,然后得到相应动态语言的运行引擎。 ScriptRuntimeSetup setup = new ScriptRuntimeSetup(true); //true表示载入所有支持的动态语言的环境配置ScriptRuntime runtime = ScriptRuntime.Create(setup); //创建动态语言运行环境foreach (LanguageProviderSetup langSetup in setup.LanguageProviders) //遍历所有动态语言的环境配置{    try    {        ScriptEngine engine = null;        if (runtime.TryGetEngine(langSetup.Names[0], out engine)) //尝试获取动态语言的运行引擎        {            //engine就是我们需要的运行引擎        }    }    catch (MissingTypeException) //处理创建不支持的动态语言时可能抛出异常    {    }} 获取了运行引擎后,我们就可以执行动态语言的代码了public class MyErrorSink : ErrorSink //编译错误处理{    IList<string> m_ErrorMsg = new List<string>();    public IList<string> ErrorMsg    {        get { return m_ErrorMsg; }    }    public MyErrorSink()    {    }    public virtual void Add(SourceUnit source, string message, SourceSpan span, int errorCode, Severity severity)    {        if (severity == Severity.Error || severity == Severity.FatalError)        {            m_ErrorMsg.Add(message);        }    }} LanguageContext langContext = HostingHelpers.GetLanguageContext(engine);SourceUnit sourceUnit = langContext.CreateSourceUnit(new SourceStringContentProvider(“1/4+3”), null, SourceCodeKind.Expression); //创建代码序列:1/4+3MyErrorSink errorSink = new MyErrorSink();try{    Scope scope = new Scope();    object ret = sourceUnit.Execute(scope, errorSink); //执行动态语言代码,ret就是执行结果的返回值了    if (errorSink.ErrorMsg.Count > 0) //检查编译错误    {        //    }}catch (Exception){} 是不是很方便呢 🙂 完整的DLR文档请参考http://compilerlab.members.winisp.net/dlr-spec-hosting.pdf(英文版) PS:你也可以使用配置文件或者直接初始化动态语言运行引擎。 Software Development Engineer范翔

2

.NET中的虚函数

面向对象的程序设计有三大要素,封装、继承和多态。虚函数是多态的重要组成部分,同时又在类的继承关系中有着很多变化。本文讨论.NET中对虚函数的支持。   首先,我们通过一个例子来看看虚函数的普通用法: class CA {         public virtual void Foo() {             Console.WriteLine(“CA.Foo”);         }     }       class CB : CA  {         public override void Foo() {             Console.WriteLine(“CB.Foo”);         } }   class Test  {         public static void InvokeFoo(CA ca)   {             ca.Foo();         }         public static void…

3

大学生眼中的“银光”

这次的博客和技术无关,也和Silverlight或CLR的最新发布没什么关系,而是想和大家一起分享一下几个学生在学习用Silverlight技术完成项目之后的一些体会的感想。   最近我在上海交通大学指导几名学生(Jianxun Wang, Jiao Jin, 以及Shanshan Chen)使用Silverlight技术制作校园选课系统,以完成他们的暑期实践项目。从项目概念生成到最后功能成形也不过短短6周的时间。这段时间无论是对他们,还是对我自己而言都是一段有趣的体验。我尝试让他们学会从用户的角度去设计项目,开发出用户体验良好的,健壮而实用产品。毕竟,对于一个真实的产品而言,最终产品是否成功的验收者始终是产品的使用者。几名聪明的大学生很快的明白了我的意思,从每周末的项目小结中,总能或多或少看到他们的改进和创新,让我感到意外的欣喜。   项目结束后,几名大学生应邀写下了他们在项目过程中的所学所想,读来挺有意思的。在industry摸爬滚打了一阵子,再看看那些来自于学生的文字和思想,亲切依然。而他们的一些想法,却也能在无形中帮助我们从另一个角度去看待一些事物。: )   让我们先看看学生们是怎么做项目的,又学到了些什么(用英文写的,不过句子还是挺容易理解的 : )):   we learned the enterprise project development process. First, we collected the requirements. As college students, the requirements could be understood easily. The school’s Course Registration System could be refer to. Also, we collected the students’ and teachers’ suggestion. They…

8

在COM应用中使用.NET组件

上一博中,我们用Visual Studio把.NET组件(托管组件)变成了COM服务器。本博继续这个话题,看看如何使用.NET工具包来完成相应的功能。 首先我们来看看今天的主题和CLR Interop的关系,在我们组里,interop这个术语包含了四个范畴,即P/Invoke, Reverse P/Invoke, COM Interop和Reverse COM Interop。前二个概念通过动态连接库(DLL)在native世界和.NET世界中实现互通性;后两个概念顾名思义,就是和COM打交道了。其中,COM interop是在.NET应用中使用COM组件;Reverse COM Interop指的是在COM应用中使用.NET组件。概念有些绕口令,看官先别急着抛转,看看下图。 可能有人会问, COM技术已经历史悠久了,.NET程序员为什么需要和它打交道呢?问题的答案就在于”组件”一词。举个例子,若干年前一个牛人写了个程序,扩展性极佳,他用了COM把插件的接口定义的明明白白,而我们想用.NET来做这个插件。。。 为COM写一个.NET组件,可以参照以下三部曲 1.       定义.NET接口,撰写.NET class 2.       部署.NET组件 3.       撰写COM客户端 第一步骤对经常从事.NET的开发朋友来说非常熟悉,这里给出例子,不再赘述。 csc /target:library a.cs 第二,要部署.NET组件,这里包括两个方面: regasm a.dll /tlb 1.       把类型库(type library)导出。对于COM应用来说,它只懂得类型库,是为COM组件遵循的二进制”标准”。/tlb选项告诉regasm,导出类型库。我们可以用oleview察看tlb的内容,如下图所示,此前定义的.NET接口和类都在其中。   2.       把步骤2中生成的dll放到注册表中。COM并不懂得诸如GAC的概念,而是通过注册表来查询HKEY_CLASSES_ROOT\CLS_ID\00000000-0000-0000-FFFF-000000000004,观察这个注册表项,InprocServer32中把COM的动态链接库指向了mscoree.dll,这就是传说中的垫片(shim),它会负责加载公共语言运行时,并找到真正的.NET组件—-a.dll。   有了以上两步,我们就可以在COM应用中使用.NET组件了。如何撰写COM组件超出了本文的范畴,有兴趣的读者可以参考代码中的注释。 cl client.cs // client.cs #define _WIN32_COM #include <stdio.h> #include <wtypes.h>   #import “a.tlb” no_namespace named_guids raw_interfaces_only…

4