.NET Framework 4新特性之 Type Equivalence(等价类型)
这是新版本.NET Framework的一个重要特性,微软官方的介绍,请参考这里 http://msdn.microsoft.com/en-us/library/dd997297.aspx
那么,到底如何理解并使用这个功能呢?
为什么需要这个功能?
这个功能,主要是解决COM interop的问题的。举个最常见的例子,如果我们需要在.NET程序里面调用Office组件,以前的情况是(以Excel为例)
1.我们在开发的时候,需要选择一个有关的Excel版本的PIA(Primary Interop Assembly),这是有版本的
2.发布的时候,需要确认目标机器是否有一样的版本的Excel
安装和部署Office PIA不是一个太简单的事情,完整的介绍,请参考 http://www.microsoft.com/china/msdn/library/office/office/BusinessApps0608.mspx?mfr=true
这里的最大问题就是,如何确保开发环境与实际使用环境的Office版本一样。事实上,你无法确保这一点。
等价类型的意思就是,将当前程序中所用到的有限的那些COM类型,导入到当前程序集中,并且生成等价的.NET类型,如此一来,就可以不再依赖PIA,而可以方便地部署了。
如何使用该功能?
使用该功能其实很简单。你可能在不知不觉中已经在使用了。
1.首先还是要添加引用
2.添加完之后,可以看到这个程序集的属性
这里有一个特殊的属性,叫Embed Interop Types,设置为true即可(针对PIA,默认就是true)
3. 编写如下代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Office.Interop.Excel; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var app = new Application(); app.Visible = true; Console.Read(); } } }
我们这里实现的功能很简单,只是启动了一个Excel的实例而已。
4. 运行调试
一个新的Excel程序窗口被打开了。
那么,究竟发生了什么呢?既然说是等价类型,会将我们用到的COM类型导入,如何理解呢?
我们看到,在程序集里面,实际上多出来一个特殊的命名空间(Microsoft.Office.Interop.Excel),然后它下面只包含当前我们的代码所必须访问的那些类型(实际上是导入过的),从这一点上看,Visual Studio是一个很智能的工具。
而且更加有意思的是,我们在Main方法中的代码,其实最终会被转换成下面这样
private static void Main(string[] args) { Application application = (Application)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("00024500-0000-0000-C000-000000000046"))); application.Visible = true; Console.Read(); }