C# 程序集Assembly
原谅我到目前为止一直肤浅的认为程序集就是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类的对象。
获得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的更多相关文章
- .NET 程序集Assembly使用
概述 一直以来,我们都在用C#编写程序,编写程序的时候,我们用到继承.多态.接口以及泛型,我们也都明白子类可以继承抽象类,并能够重写父类的抽象方法,可是大家是否想过,如下几个问题: 1.凡树必有根和叶 ...
- 程序集(Assembly)和模块(Managed Module)
前言 一直都用集成开发坏境(IDE),一直对模块和程序集的概念理解的不是很直观,因为一Build就把你的单个模块塞进程序集里面去了.当然,对你的编程也不会造成太大的影响.但有些东西你最好还是知道比较好 ...
- C#程序集Assembly学习随笔(第一版)_AX
①什么是程序集?可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件.嗯,这个确实简单了些,但我是这么理解的.详细:http://blog.csdn.net/sws8327/ ...
- C#程序集Assembly学习随笔(增补版,附图)_AX
上篇我讲了下我对Assembly的初步认知.现在来说说怎么使用已有的Assembly.比如说我在做一个解决方案时,发现你做的解决方案的某个项目中的类的方法(功能)我正好可以用到,哈,那我就不用写类了, ...
- C# 程序集(Assembly)
程序集 程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件.程序集只是逻辑上的划分,一个程序集可以只由一个文件组成,也可由多个文件组成.不管是单文件程序集还是多文件程序 ...
- 自动加载dll,加载dll中程序集的信息。
自动加载程序集,解析程序集中的方法. private static object Invoke(string lpFileName, string Namespace, string ClassNam ...
- 程序集与反射技术(C#)
首先我们来看程序集,程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件(例如可执行文件.exe和类库文件.dll).由于程序集在编译后并不一定会生成单个文件,而可能会生 ...
- .NET 程序集与命名空间
程序集 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合. 组成部分 Windows文件首部 CLR文件首部 程序集清单 类型元数据 MSIL(CIL)代码 嵌入资源集 作用 ...
- 30天C#基础巩固----程序集,反射
一:认识程序集 只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集.那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly). ...
随机推荐
- 7.matlab字符串分析
1 字符串处理函数 clc; clear all; str='My name is Robin.'; disp(str); %字符串的输出 str_size=size(str) %字符串的长度 str ...
- BZOJ 3624 并查集 (Kruskal)
思路: 先把所有能加上的水泥路都加上 判断哪些是必加的鹅卵石路 再重新做一遍最小生成树 加上必加的鹅卵石路 一直加鹅卵石路 判一下是不是=k 最后加上水泥路就好了 //By SiriusRen #in ...
- P1888 三角函数
题目描述 输入一组勾股数a,b,c(a≠b≠c),用分数格式输出其较小锐角的正弦值.(要求约分.) 输入输出格式 输入格式: 一行,包含三个数,即勾股数a,b,c(无大小顺序). 输出格式: 一行,包 ...
- Codeforces 993A. Two Squares(暴力求解)
解题思路(暴力解法) 平行于x轴的正方形和与x轴成45度倾斜的正方形相交的点中必定有整数点.即若两正方形相交,必定存在整数i,j,使(i,j)同时属于两个正方形. 我们把两个正方形中的整数点都找出来, ...
- python学习——正则表达式
正则表达式 正则表达式的主要作用就是对字符串进行匹配,通过匹配,进行筛选,选择出符合规则的字符串.其实正则表达式的作用就像是一个过滤器一样.你输入好自己的 ...
- JAVA在线观看视频教程完整版
今天给大家介绍一下JAVA在线观看视频教程完整版,我们知道Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语 ...
- Apache2.2伪静态配置
最近由于工作的需要要配置一下Apache的伪静态化,在网上搜了好多都无法完成,所以觉得有必要在这里写一下. 第一步:打开Apache的httpd.conf文件,把LoadModule rewrite_ ...
- Pyhton学习——Day31
# 服务端和接收端的send和reve没有任何关系,只与协议之间有关系# 应用程序产生的数据一定会交给操作系统,并由操作系统往外发送# 发送端什么时候会清空自己的内存?# 收到接收端的ACK响应以后才 ...
- C# 基础复习 四 ADO
调用存储过程,并接收多个表的查询结果 一个表用一个DataTable,DataSet可以存储多个DataTable DataSet需要SqlDataAdapter来填充数据 SqlConnection ...
- luogu 自适应Simpson2
自适应simpson2 题意 求一个不定积分 解法 画出函数的图像,可以知道其在0处函数值趋近于 $ + \infty $,在10处趋近于0,所以我们从0积分到10就可以了(保险起见,积到15) 代码 ...