.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.首先还是要添加引用

image

2.添加完之后,可以看到这个程序集的属性

image

这里有一个特殊的属性,叫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类型导入,如何理解呢?

image

我们看到,在程序集里面,实际上多出来一个特殊的命名空间(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();
}

image

posted @ 2011-05-18 18:14  陈希章  阅读(1179)  评论(4编辑  收藏  举报