原谅我到目前为止一直肤浅的认为程序集就是dll,这种想法是错误的。

今天就系统的学习记录一下“程序集”的概念。原文链接https://www.cnblogs.com/czx1/p/201413137070-com.html

  程序集包含了两种文件:可执行文件(.exe文件)和 类库文件(.dll文件)。

  在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。

  应用程序结构:包含 应用程序域(AppDomain),程序集(Assembly),模块(Module),类型(Type),成员(EventInfo、FieldInfo、MethodInfo、PropertyInfo) 几个层次。

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

  从【应用程序结构】中不难看出程序集Assembly的组成:

 

   MemberInfo 该类是一个基类,它定义了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多个公用行为 。

   一个程序运行起来以后,有一个应用程序域(AppDomain),在这个应用程序域(AppDomain)中放了我们用到的所有程序集(Assembly)。我们所写的所有代码都会编译到【程序集】文件(.exe .dll)中,并在运行时以【Assembly对象】方式加载到内存中运行,每个类(Class  Interface)以【Type对象】方式加载到内存,类的成员(方法,字段,属性,事件,构造器)加载到内存也有相应的对象。

Assembly程序集对象  https://blog.csdn.net/CJB_King/article/details/80521481

  Assembly 是一个抽象类,我们用的都是RuntimeAssembly的对象。

获得程序集的方式:

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

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

    所有用到过得aessembly。如果只是add ref了,没有在程序中用到,AppDomain.CurrentDomain.GetAssemblies()中没有。用到时才被JIT加载到内存。

    每个app都有一个AppDomain,OS不允许其他app访问这个程序的AppDomain

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

    this.GetType().Assembly;

    Type对象肯定在一个assembly对象中

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

  3. 根据路径加载程序集

    Assembly.LoadFrom(assPath);

 Type类型对象

  Type 是一个抽象类,我们用的都是TypeInfo类的对象。

  程序运行时,一个class对应一个Type类的对象。通过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();

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

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

 

C# 程序集Assembly的更多相关文章

  1. .NET 程序集Assembly使用

    概述 一直以来,我们都在用C#编写程序,编写程序的时候,我们用到继承.多态.接口以及泛型,我们也都明白子类可以继承抽象类,并能够重写父类的抽象方法,可是大家是否想过,如下几个问题: 1.凡树必有根和叶 ...

  2. 程序集(Assembly)和模块(Managed Module)

    前言 一直都用集成开发坏境(IDE),一直对模块和程序集的概念理解的不是很直观,因为一Build就把你的单个模块塞进程序集里面去了.当然,对你的编程也不会造成太大的影响.但有些东西你最好还是知道比较好 ...

  3. C#程序集Assembly学习随笔(第一版)_AX

    ①什么是程序集?可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件.嗯,这个确实简单了些,但我是这么理解的.详细:http://blog.csdn.net/sws8327/ ...

  4. C#程序集Assembly学习随笔(增补版,附图)_AX

    上篇我讲了下我对Assembly的初步认知.现在来说说怎么使用已有的Assembly.比如说我在做一个解决方案时,发现你做的解决方案的某个项目中的类的方法(功能)我正好可以用到,哈,那我就不用写类了, ...

  5. C# 程序集(Assembly)

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

  6. 自动加载dll,加载dll中程序集的信息。

    自动加载程序集,解析程序集中的方法. private static object Invoke(string lpFileName, string Namespace, string ClassNam ...

  7. 程序集与反射技术(C#)

    首先我们来看程序集,程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件(例如可执行文件.exe和类库文件.dll).由于程序集在编译后并不一定会生成单个文件,而可能会生 ...

  8. .NET 程序集与命名空间

    程序集 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合. 组成部分 Windows文件首部 CLR文件首部 程序集清单 类型元数据 MSIL(CIL)代码 嵌入资源集 作用 ...

  9. 30天C#基础巩固----程序集,反射

    一:认识程序集       只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集.那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly).    ...

随机推荐

  1. 踩坑 Windows 解决pip install出现“由于目标计算机积极拒绝,无法连接”的问题

    解决pip install出现“由于目标计算机积极拒绝,无法连接”的问题   可能是使用某软件自动设置了代理, 所以需要手动的取消代理才可以.   在Intel选项中把所有的代理都给去掉就可以了... ...

  2. Centos6.5添加Epel和Remi源安装Lamp环境

    想搭建一个Lamp环境,因为编译安装太麻烦,对于我这样的新手来说,太过于复杂.而CentOS自带的Apache.MySql和PHP的版本都太低,不想用.上百度搜了一轮,原来可以通过添加Epel和Rem ...

  3. Extjs 可重用组件开始写 2014 8 23日

    今天开始自己去写组件. 这次写组件重点在于参考cfWeb来写出自己的组件. 首先先把结构做出来. 对于这次的自定义组件,现在所做的事情关键在于上面四个文件.于是将上面四个文件贴出来. MyApp.js ...

  4. MVC中添加模块区域,并设置RedirectToAction跳转

    废话少说,直接上图:

  5. JQuery学习系列篇(二)

    1.事件切换函数 hover([over],out); over鼠标移动到元素上要触发的函数,out鼠标移出元素要触发的函数. 2.togger 如果元素是可见的,切换为隐藏的:如果元素是隐藏的,切换 ...

  6. dfs___刷题记录

    poj 1564 给出一个s,n个数,输出所有的能够得到s的方案 #include<cstdio> #include<cstring> #include<iostream ...

  7. 路飞学城Python-Day20(元类的练习题)

    练习一:在元类中控制把自定义类的数据属性都变成大写 class MyDef(type): def __new__(cls, class_name, class_attr, class_dic): up ...

  8. node——简单的服务器启动+乱码问题解决,响应报文头

    这个是一个比较简单的代码 // 1.加载hrrp模块 var http=require('http'); // 2.创建一个http服务对象 var server=http.createServer( ...

  9. Linux(1)---常用命令

    1.将tgz文件解压到指定目录: # tar zxvf test.tgz -C 指定目录 比如将 /lyl/test.tgz解压到 /lyl/linux 目录下 # tar zxvf /lyl/tes ...

  10. Lua 中的 RSA 加解密实现

    记得之前,部门某款游戏陆陆续续收到一些玩家反馈,抱怨在登录游戏时会等待很久.初步排查后基本断定可能是此游戏的登录服务器程序某块代码有问题,于是即安排了服务器同事作排查分析但一直无果. 之后我时间有了空 ...