C# Assembly

一、简介

程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件。程序集只是逻辑上的划分,一个程序集可以只由一个文件组成,也可由多个文件组成。不管是单文件程序集还是多文件程序集,它们都由固定的结构组成

常见的两种程序集:
可执行文件(.exe文件)和 类库文件(.dll文件)。
在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。

他们之间是一种从属关系,也就是说,一个AppDomain能够包括N个Assembly,一个Assembly能够包括N个Module,一个Module能够包括N个Type,一个Type能够包括N个成员。他们都在System.Reflection命名空间下。【公共语言运行库CLR】加载器 管理 应用程序域,这种管理包括 将每个程序集加载到相应的应用程序域 以及 控制每个程序集中类型层次结构的内存布局。

模块是可移植的可执行文件,例如 type.dll 或 application.exe,由一个或多个类和接口组成。 单个模块可包含多个命名空间,而一个命名空间可跨越多个模块。
在这里插入图片描述

二、Assembly程序集对象

1.获得当前对象所属的类所在的程序集

 this.GetType().Assembly;
 
 Type对象肯定在一个assembly对象中

 可以通过Type对象得到程序集。

2.根据路径加载程序集

 Assembly.LoadFrom(assPath);

3.获得当前【应用程序域】中的所有程序集

Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();

三、Type类型对象

Type 是一个抽象类,我们用的都是TypeInfo类的对象。
程序运行时,一个class对应一个Type类的对象。通过Type对象可以获得类的所有信息。

1. 通过类获得对应的Type

 Type t1 = typeof(Person);

2. 通过对象获得Type

 Type t2 = person.GetType();  this.GetType();

3.用assembly对象,通过类的full name类获得type对象

 Assembly ass1 = Assembly.LoadFrom(@"c:\users\xcao\documents\visual studio 2012\Projects\ConsoleApplication6\ConsoleApplication6\libs\Ecole.dll");

     //GetType的参数一定要是full name的string

    Type tStu = ass1.GetType("Ecole.Student"); 

    object stu1 = Activator.CreateInstance(tStu);

4.获得程序集中定义的所有的public类

 Type[] allPublicTypes = ass1.GetExportedTypes();

5.获得程序集中定义的所有的类

 Type[] allTypes = ass1.GetTypes();

6.通过Assembly创建类

6.1 RefClass 辅助类

using System;
using System.Collections.Generic;
using System.Text;

namespace _01
{
    public class RefClass
    {
        private int _test3;
        private int _test1 { get; set; }
        protected int Test2 { get; set; }
        public int Test3 { get; set; }

        public void Show()
        {
            Console.WriteLine("hhhh");
        }
    }
}

6.2 Program

在这里插入图片描述

using System;
using System.Reflection;

namespace _01
{
    internal class Program
    {
        static void Main(string[] args)
        {
           
            //加载程序集这里是01
            Assembly ass = Assembly.Load("01");
            //遍历程序集里所有Type的全名
            foreach (var a in ass.GetTypes())
            {
                Console.WriteLine("Name: " + a.Name);
                Console.WriteLine("FullName: " + a.FullName);
            }
            //GetType要使用FullName,使用Name不起效
            Type type1 = ass.GetType("_01.RefClass");
            //Activator通过类型创建实体
            object refClass1 = Activator.CreateInstance(type1);
            //强制转换为RefClass
            RefClass refClass2 = (RefClass)refClass1;
            refClass2.Show();
         
            Console.ReadKey();
        }
    }
}

7.Type类的属性:

t.Assembly; 获取t所在的程序集

t.FullName; 获取t所对应的类的full name

t.Name; 获取t所对应的类的 name

t.IsArray; 判断t是否是一个数组类

t.IsEnum; 判断t是否是一个枚举类

t.IsAbstract; 判断t是否是一个抽象类

t.IsInterface; 判断t是否是一个interface

8.Type类的方法:

notebookInterfaceType.IsAssignableFrom(Type t);判断t是否实现了 notebookInterfaceType 接口

t.IsSubclassOf(Type parent); t是否是parent的子类

t.IsInstanceOfType(object o); o是否是t类的对象

t.GetFields();  //method, property  得到所有的public的fields,methods,properties

 t.GetField("gender"); 根据名字得到某个field
  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值