TypeForwardedTo Attribute ---- 类型传递
什么是类型传递?
类型传递是一个属性(在TypeForwardedTo中实现),它允许你将一个类型从一个程序集(程序集A)移动到另一个程序集(程序集B),并且在客户端实例化程序集A时不需要重新编译,就可以运行。在一个组件(程序集)载入并被客户端应用程序使用后,你可以用类型传递将组件中一个类型移动到另一个程序集,而客户端应用程序仍将保持工作,不需要重新编译。类型传递只能使用在从已存在的应用程序引用的组件。当你重新编译一个应用程序时,在应用程序中使用的任何类型都必须是恰当的程序集引用(这个程序集已存在)。
1.添加一个TypeForwardedTo属性到来源程序集类库。
2.将类型声明代码剪切
3.将剪切的类型声明代码粘贴到目的类库。
4.编译两个类库
下面代码示范将TypeA移动到DestLib类库的属性声明。
using System.Runtime.CompilerServices;
[assembly:TypeForwardedTo(typeof(DestLib.TypeA))]
1.新建一个类库项目命名为Milan,里面有2个方法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Milan { public class MyClass { public int Calculate(int x, int y) { return x + y; } } public class MyResidentClassInLib1 { public float CalculateRadius(float Radius) { return (float)(2 * Radius * 3.141592654); } } }
2.新建一个WinForm程序,拖放2个按钮,分别调用这2个方法:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Milan; namespace Calculate { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Calculate_Click(object sender, EventArgs e) { MyClass myclass = new MyClass(); MessageBox.Show(myclass.Calculate(10, 20).ToString()); } private void CalculateRadius_Click(object sender, EventArgs e) { MyResidentClassInLib1 lib = new MyResidentClassInLib1(); MessageBox.Show(lib.CalculateRadius(200).ToString()); } } }
现在能成功运行出结果。然后把Calculate方法移到另外一个程序集。
3.新建一个类库项目,命名为Inter,同时把原来Milan项目里面的Calculate方法全部注释,并把Calculate移到新的Inter项目,保证命名空间,方法都一样:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Inter { public class Inter { } } namespace Milan { public class MyClass { public int Calculate(int x, int y) { return x + y; } } }
4.重新编译Inter项目,Milan项目添加引用Inter的Dll,并在Milan项目的AssemblyInfo.cs文件里添加属性:
[assembly: TypeForwardedTo(typeof(Milan.MyClass))]
5.重新编译Milan项目。
6.把重新编译过的Inter.dll和Milan.dll同时拷贝到Winform项目调用的文件夹。
7.再次运行,成功。