C#4.0 新特性 dynamic 简化Com调用的复杂度

来源:互联网 发布:上帝视角的人 知乎 编辑:程序博客网 时间:2024/06/05 00:16

我们以前要实现朗读一段文本,需要如何做呢?

首先在项目中引用 Microsoft Speech Object Library 。 如下Com组件:

image

然后是一堆复杂的代码。这部分的实现可以采看以下几篇文章:

.Net平台下开发中文语音应用程序
http://www.microsoft.com/china/community/program/originalarticles/TechDoc/Cnspeech.mspx

C#中实现语音朗读(短信 & 语音短信)sms
http://www.cnblogs.com/joyyuan97/archive/2009/02/26/1398716.html

 

当然 由于 .Net Framework 3.0 中增加了一个命名空间:System.Speech。 实际上从 .Net Framework 3.0 开始,我们要实现语音朗读要简单多了,具体如何实现可以参看我之前的博客:用.net 编码实现朗读文本的方法。 但是我们操作其他微软没有封装的 Com 组件,仍然跟之前一样超级复杂,而且需要相当的技巧。

 

在 .Net 4.0 中,我们只需要三行代码就可以实现上面的功能,而且项目不需要引用 Microsoft Speech Object Library 。超简单,这是利用了 C# 4.0 的动态查找新特性, 即 dynamic 类型。有关 dynamic 的基础知识,请参看我前篇博客: C# 4.0 特性: dynamic 和 ExpandoObject 。

C# 4.0 的项目不需要引用任何其他组件,只需要下面简单的几行代码,完成阅读文字的功能。

using System;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            Type type = Type.GetTypeFromProgID("SAPI.SpVoice");            dynamic spVoice = Activator.CreateInstance(type);            spVoice.Speak("你好,郭红俊,欢迎使用 CSharp 4.0!");                    }    }}


这个例子引用了 Speech API 中的 SAPI.SpVoice 对象,并调用了其 Speak() 方法。

Type.GetTypeFromProgID 用于获取与指定程序标识符 (ProgID) 关联的类型。

ProgID 是程序员给某个CLSID指定一个易记的名字。在注册表的 HKey_Classes_Root 下,有版本号的ProgID和无版本号的ProgID都会列出,一般无版本号的除了有CLSID子键外会还有CurVer子键来标明版本。

Type.GetTypeFromProgID  是 .NET Framework 1.0 就具有的功能, 但为何到了 .NET Framework 4.0 我们才可以写出这么简单的代码, 这关键就是 dynamic 类型的引用。

任何直接声明为 dynamic 类型的变量,或者从函数中返回 dynamic 类型的值,都将自动地视为后期绑定。即在运行时才会被初始化绑定。 由于这个原因,我们才会用这么简单的代码实现对Com的调用。 

 

参考资料:

C# 4.0 特性: dynamic 和 ExpandoObject
http://blog.joycode.com/ghj/archive/2009/12/29/115832.joy

ProgID是什么
http://kb.cnblogs.com/a/1218548/

原创粉丝点击