程序集

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

常见的两种程序集:

  可执行文件(.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对象】方式加载到内存,类的成员(方法,字段,属性,事件,构造器)加载到内存也有相应的对象。

详细:https://www.cnblogs.com/luna-hehe/p/10143748.html

程序集的结构:

程序集元数据,类型元数据,MSIL代码,资源。

①程序集元数据,程序集元数据也叫清单,它记录了程序集的许多重要信息,是程序集进行自我说明的核心文档。当程序运行时,CLR 通过这份清单就能获取运行程序集所必需的全部信息。清单中主要主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可)。

②类型元数据,类型元数据列举了程序集中包含的类型信息,详细说明了程序集中定义了哪些类,每个类包含哪些属性和方法,每个方法有哪些参数和返回值类型,等等。

③MSIL代码,程序集元数据和类型元数据只是一些辅助性的说明信息,它们都是为描述MSIL代码而存在的。MSIL 代码是程序集的真正核心部分,正是它们实现了程序集的功能。比如在“Animals”项目中,五个动物类的C#代码最终都被转换为MSIL 代码,保存在程序集Animals.dll 中,当运行程序时,就是通过这些MSIL 代码绘制动物图像的。

④资源,程序集中还可能包含图像、图标、声音等资源。

私有程序集和共享程序集

私有程序集是仅供单个软件使用的程序集,安装很简单,只需把私有程序集复制到软件包所在文件夹中即可。而那些被不同软件共同使用的程序就是共享程序集,.NET类库的程序集就是共享程序集,共享程序集为不同的程序所共用,所以它的部署就不像私有程序集那么简单,必须考虑命名冲突和版本冲突等问题。解决这些问题的办法是把共享程序集放在系统的一个特定文件夹内,这个特定文件夹称为全局程序集高速缓存(GAC)。这个过程可用专门的.NET 工具完成

程序集的特性

// 将 ComVisible 设置为 false 使此程序集中的类型对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(false)] // 如果此项目向 COM 公开,则下列 GUID 是用于类型库的 ID
[assembly: Guid("816a1507-8ca5-438d-87b4-9f3bef5b2481")] // 程序集的版本信息由下面四个值组成:主版本、次版本、内部版本号、修订号
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

程序集的属性信息是由特性实现的,与普通特性的不同的是,描述程序集的特性前要添加前缀“assembly:”

原文链接:https://www.cnblogs.com/Sweepingmonk/p/10867975.html

Assembly 程序集对象

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

获得程序集的方式:

  • 获得当前程序域中的所有程序集

    • Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();
    • 所有用到过得aessembly。如果只是add ref了,没有在程序中用到,AppDomain.CurrentDomain.GetAssemblies()中没有。用到时才被JIT加载到内存。
    • 每个app都有一个AppDomain,OS不允许其他app访问这个程序的AppDomain
  • 获得当前对象所属的类所在的程序集
    • this.GetType().Assembly;
    • Type对象肯定在一个assembly对象中
    • 可以通过Type对象得到程序集
  • 根据路径加载程序集

    • Assembly.LoadFrom(assPath);
Assembly assembly = Assembly.LoadFrom(@"E:\Work\VSCode\ConsoleApp1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll");
Type[] allTypes = assembly.GetTypes();
Type stu = assembly.GetType("ClassLibrary1.Student");
object stu1 = Activator.CreateInstance(stu);
Console.WriteLine(stu1);

Type 类型对象

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

程序运行时,一个class对应一个Type类的对象。通过Type对象可以获得类的所有信息。

获得Type对象的方式:

  • 通过类获得对应的Type

    • Type t1 = typeof(Person);
  • 通过对象获得Type用assembly对象,通过类的full name类获得type对象
    • Type t2 = person.GetType();
    • this.GetType();
    • Type stu = assembly.GetType("ClassLibrary1.Student");
  • 获得程序集中定义的所有的public类

    • Type[] allPublicTypes = ass1.GetExportedTypes();
  • 获得程序集中定义的所有的类

    • 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

Type类示例:

static void TypeTest1()
{
Person p = new Person { Name = "NaNa", Age = };
Type typePerson = p.GetType(); //搜索具有指定名称的公共属性
PropertyInfo pf = typePerson.GetProperty("Name");
pf.SetValue(p, "LiLi", null);
Console.WriteLine(p.Name); //返回所有公共属性
PropertyInfo[] props = typePerson.GetProperties();
StringBuilder builder = new StringBuilder();
foreach (PropertyInfo item in props)
{
builder.Append(item.Name + "=" + item.GetValue(p, null) + "\n");
}
builder.Append("----------------------\n"); //返回所有公共字段
FieldInfo[] fieIds = typePerson.GetFields();
foreach (FieldInfo item in fieIds)
{
builder.Append(item.Name + "=" + item.GetValue(p) + "\n");
}
builder.Append("----------------------\n"); //返回所有公共方法
MethodInfo[] methods = typePerson.GetMethods();
foreach (MethodInfo item in methods)
{
builder.Append(item + "\n");
}
builder.Append("----------------------\n");
Console.WriteLine(builder); //返回所有公共构造函数
ConstructorInfo[] cons = typePerson.GetConstructors();
foreach (ConstructorInfo item in cons)
{
//Name都是 .ctor
Console.WriteLine(item.Name + "\n");
//构造函数的参数个数
Console.WriteLine(item.GetParameters().Length + "\n"); ParameterInfo[] parames = item.GetParameters();
foreach (var pars in parames)
{
Console.WriteLine(pars.Name+":"+pars.ParameterType);
}
}
}

原文链接:https://blog.csdn.net/CJB_King/article/details/80521481

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

  1. .NET 程序集Assembly使用

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

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

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

  3. C# 程序集Assembly

    原谅我到目前为止一直肤浅的认为程序集就是dll,这种想法是错误的. 今天就系统的学习记录一下“程序集”的概念.原文链接https://www.cnblogs.com/czx1/p/2014131370 ...

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

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

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

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

  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. python 元组 列表 字典

    type()查看类型 //取整除 **幂 成员运算符: in  x在y序列中,就返回true 反之  not in 身份运算符: is is not 逻辑运算符 and or not 字符编码 问题 ...

  2. vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分

    0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.准备工作 1.1前端框架 前端使用了基于vue.js的nuxt.js.为什么使用nuxt.js? 首先我做的是博客的项目 ...

  3. Mac下怎么更新nodejs

    Windows下更新nodejs最简单粗暴的应该就是去官网下载安装包安装了,昨天项目中需要更新nodejs我便找了一下相关文章,发现有一个 n 模块可以管理node,n 是Node的一个模块,所以安装 ...

  4. 4 Values whose Sum is 0 UVA 1152

    题目链接:https://vjudge.net/problem/UVA-1152 这题题意就是在四个集合内.每个集合分别里挑一个数a,b,c,d,求a+b+c+d=0有多少种选法. 暴力的话就是四重循 ...

  5. 19新生赛 谁更nb

    题目描述: 有一堆石子共有N个.syx xxh两个人轮流拿,syx先拿.每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获 胜.syx xxh都非常聪明,拿石子的过程中不会出现失误.给出N和K,问最后 ...

  6. 2018ICPC南京站Problem A. Adrien and Austin

    题意: n个石头再1-n的位置上,两个人轮流取时候,必须取连续的一段,最多取k个,不能取为输,问谁会赢 解析: 当k大于等于2时,先手总能把石头分成相等的两部分,此时后手无论怎么走,先手在对称的位置选 ...

  7. Eclipse创建JSP、HTML、CSS文件默认字符集设置成UTF-8

    问题:在使用eclipse的时候总是发现新创建的JSP文件.HTML文件等默认总是ISO-8859-1,每次都要修改成自己使用的utf-8的,很是麻烦,因此在网上查看了一下发现是可以修改字符集的默认值 ...

  8. 获取table中CheckBox选中行的id

    方式一 var selectList=''; jQuery(".table tbody input[type=checkbox]:checked").map(function () ...

  9. Javascript 利用 switch 语句进行范围判断

    ; switch (true) { ): alert("less than five"); break; ): alert("between 5 and 8") ...

  10. C++——浅拷贝

    10.深拷贝与浅拷贝 浅拷贝: 实现对象间数据元素的一一对应赋值:(默认构造函数) 深拷贝: 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制. //浅拷贝 # ...