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.再次运行,成功。

 

 

 

posted on 2012-07-19 17:14  Scarface  阅读(957)  评论(0编辑  收藏  举报

导航