什么是类型传递?
类型传递是一个属性(在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.再次运行,成功。