技术开发 频道

.NET 2.0: 类型转递(Type Forwarding)

   【IT168 技术文档】 Type Forwarding指的是:.NET运行时将对某一个程序集(Assembly)之中定义类型的引用转递为对另外一个或者几个(更新的)Assembly之中同样类型的引用。

    通过Type forwarding,所有引用(Reference)了Original程序集的程序会去引用新的程序集。

    下面让我们通过实例演示Type Forwarding的使用

    首先,创建显示Tech Ed 2005北京开始日期的一个简单类.将文件存为TechEd2005.cs.

using System;
namespace Microsoft.Tech.Ed
{
public static class China
{
public static DateTime GetBeijingStartDate()
{
return new DateTime(2005, 9, 23);
}
}
}

    编译第一个Assembly: csc /t:library Teched2005.cs,生成的Assembly就叫作TechEd2005.dll.

    然后我们写一个Console Application打印出日期来。将以下代码存为reminder.cs

using System;
namespace Realize.Net.Potential
{
public class Demo
{
public static void Main()
{
Console.WriteLine("Mark the date: " + Microsoft.Tech.Ed.China.GetBeijingStartDate().ToLongDateString());
}
}
}

编译reminder.cs: csc /t:exe /r:Teched2005.dll reminder.cs

运行reminder.exe就可以看到:Mark the date: Friday, September 23, 2005

但是不知不觉就到2006年了。我们需要推出新的Tech Ed日期了。假定Tech Ed 2006北京的开始日期为9月21日星期四,我们有新文件TechEd2006.cs如下

using System;
namespace Microsoft.Tech.Ed
{
public static class China
{
public static DateTime GetBeijingStartDate()
{
return new DateTime(2006, 9, 21);
}
}
}

编译产生TechEd2006.dll: csc /t:lib Teched2006.cs

只是reminder.exe还是打印出2005年的日期。我们使用Type Forwarding解决更新类型之实现的功用。修改TechEd2005.cs成为

using System;
[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(Microsoft.Tech.Ed.China))]
namespace Microsoft.Tech.Ed
{
}    

    注意:TechEd2005.cs中原先的实现已经被删除。重新编译TechEd2005.cs,这一次需要引用TechEd2006.dll: csc /t:library /r:teched2006.dll TechEd2005.cs

    再次运行reminder.exe,就可以看到:Mark the date: Thursday, September 21, 2006

重复一下要点:第一个(旧的)Assembly需要重新编译以使用TypeForwardedTo属性,但是新的Assemby和引用旧Assembly的Reminder.exe不需要重新编译。其对Microsoft.Tech.Ed.China的引用被CLR Runtime自动转递到新的Assembly上。旧的和新的assemblies须同时存在。

TypeForwardedTo只能用于Assembly。


 

0
相关文章