【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。