前言:用了几天的时间把高级编程里面程序集一章看完了,原来自己只知道写代码,右键添加引用,从来也不知道操作的实质是什么,微软总是这个套路,鼠标点点就能把任务完成,这对新手友好但是对要通透了解程序执行和内部原理的程序员来说真是有点膈应。

程序集的概述

1.1程序集定义

程序集是 .net 应用程序的部署单元。.net应用程序包含一个或多个程序集。通常拓展名是exe或dll的 .net可执行文件被称为程序集。

程序集是自我描述的安装单元,由一个或多个文件组成。

程序集可以是私有的或共享的。在简单的 .net应用程序中,最好使用私有程序及工作。私有程序集没有特殊的管理、注册和版本设置的问题。

1.2程序集的功能

程序集的功能总结如下:

  • 程序集是自描述的。不在需要考虑注册表键,从其他地方获得类型库等问题。程序集包含了描述程序集的元数据。元数据包括从程序集中导出的类型和一个清单。
  • 版本的相互依赖性在程序集的清单中进行的记录。
  • 程序集可以并行加载,同一个DLL的不同版本可以在系统上同时使用。
  • 应用程序使用应用程序域来确保其独立性。使用应用程序域,许多应用程序就可以独立的运行在一个机制中。一个应用程序中的错误不会直接影响同一个进程中的其他应用程序。

    1.3程序集的结构

    程序集由描述它的程序集元数据,描述导出赖幸和方法的类型元数据,MSIL代码和资源。所有的这些部分都在一个文件中,或者分布在几个文件中。

(太具体的知识涉及到IL,作为程序开发,如果不是有需要我觉得没有必要深究)

1.4 程序集清单

程序集清单是元数据的一部分,描述了程序集和引用它所需要的所有信息,并列出来它所有的依赖关系。清单有以下部分组成:

  • 标识(名称,版本,区域性和公钥)
  • 属于该程序集的一个文件列表。一个程序集只要要有一个文件,也可以包含多个文件。
  • 被引用程序集的列表。在程序集清单中说明了再程序集中使用的所有程序集,这些引用信息包括版本信息和公钥。公钥用于唯一地标识程序集。
  • 一组许可请求————运行这个程序集需要的许可。
  • 导出类型。

    1.5 程序集的特性

    在创建Visual Studio项目时,会自动生成AssemblyInfo.cs,这个文件用于配置程序集清单,编译器读取特性,把特定的信息插入到程序集清单中。

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; // 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("StrongNameTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StrongNameTest")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)] // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("3583900e-78ff-4a15-9168-ad05faf1e0fd")] // 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

诸如引用秘钥文件为程序集创建强命的操作都可以在这里配置


程序集和应用程序域的关系

在 .net之前的技术中,进程作为独立的边界来使用,每个进程都有其私有的虚拟内存;运行在一个进程的应用程序不能写入另个一个应用程序的内存,也不会因为这种方式破坏其他的应用程序。该进程引用程序之间的一个独立安全的边界。在 .net体系结构中,应用程序有一个新的边界:应用程序域。使用托管IL代码,运行库可以确保在同一个进程中不能访问另一个应用程序的内存。
多个应用程序可以运行在一个进程的多个应用程序域中。
和一个完整的进程相比,应用程序域的CPU和内存占用要小的多。因此CLR加载和卸载应用程序域比起完整的进程来说也快的多。

在 .net中,AppDomain类是用来操作应用程序域的,具体代码操作在AppDomain操作

下面是程序集的简单操作

      static void Main(string[] args)
{
AppDomain currentAppDomain = AppDomain.CurrentDomain;
Console.WriteLine(currentAppDomain.FriendlyName); AppDomain secondDomain = AppDomain.CreateDomain("New AppDomain");
//
secondDomain.ExecuteAssembly("TestAppDomain.exe"); secondDomain.CreateInstance("TestAppDomain", "TestAppDomain.Demo", true, BindingFlags.CreateInstance,
null, new object[] { 7, 3 }, null, null); Console.ReadKey(); }

共享程序集

程序集可以由一个应用程序单独使用,在默认情况下不共享程序集。在使用共享程序集是,需要考虑一些特定的要求。

2.1强命

自己的理解,.net中强命的设计是GUID+摘要算法+非对称加密

  • GUID保证共享程序集名称是全局唯一的
  • 摘要算法保证内容不被篡改
  • 非对称加密保证发布者合法,对摘要算法结果进行加密保证文件不被篡改

2.2全局程序集缓存

顾名思义,全局程序集缓存(Global Assembly Cache)就是可全局使用的程序集的缓存。大多数共享程序集都安装在这个缓存中;另外,也可以使用共享目录(也在服务器上)。

GAC位于\assembly目录下。

gacutil.exe 实用工具可以使用命令行安装、卸载和显示程序集。更加具体的操作在博客园地址中留作备用,这里就不赘述了。

先写这么多吧,感觉更多的东西需要工作中再补充,这里总结只是一些概念

扫盲--.net 程序集的更多相关文章

  1. 写给自己的 程序集&msil 扫盲

    嘴上不说 心里却想MD 这家伙在博客园装了这么久的高手 竟然连这都不会 ,我去噢. 程序集签名 .net 下 “程序集” 什么东东 ,反正就是听着挺牛x的,其实就是指“一堆程序”从我们传统的C++封装 ...

  2. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  3. 【.net 深呼吸】程序集的热更新

    当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...

  4. 【.net 深呼吸】跨应用程序域执行程序集

    应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...

  5. [转载]敏捷开发之Scrum扫盲篇

    现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP...      为了不落后他人,于是我也开始学习Scrum,今天主要是对我最近阅读的相关资料,根据自己的理解,用自己的话来讲述S ...

  6. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  7. ECMAScript 6 扫盲

    ECMAScript 6 目前基本成为业界标准,它的普及速度比 ES5 要快很多,主要原因是现代浏览器对 ES6 的支持相当迅速,尤其是 Chrome 和 Firefox 浏览器,已经支持 ES6 中 ...

  8. .NET 程序集单元测试工具 SmokeTest 应用指南

    Smoke Test(冒烟测试),也称Regression Test(回归测试),是对软件的安装和基本功能的测试.一般地我们使用脚本来实现Smoke Test的自动化,可借用虚拟机的snapshot机 ...

  9. MSSQLSERVER添加c# clr程序集的使用方法

    前言 MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨.这么好的机制,大 ...

随机推荐

  1. ZFS -世界上最高级的文件系统之一

    https://www.oschina.net/news/44302/openzfs_launch_announcement https://en.wikipedia.org/wiki/ZFS ZFS ...

  2. 聊聊、Zookeeper API

    今天我们来说说 Zookeeper 客户端启动,整个文章分三个部分:第一部分是 Zookeeper 原生 API 客户端,第二部分是开源客户端 ZkClient,第三部分是开源客户端 Curator. ...

  3. Mac. 文件夹赋予权限

    1. click on your background to go to finder click on go and go to folder /usr right click on local a ...

  4. VS2010 MFC中 窗口分割的实现

    分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...

  5. 深入浅出AOP(四)--AOP的实现步骤

    AOP是什么?有什么用处?怎么实现?在前面的博客中已经写的非常具体了,那么我们怎么一步一步考虑的呢? 在最初的时候,我们知道AOP是一个拦截业务.提供服务的东西.于是我们是这样做的: 后来又了加上了S ...

  6. 【京东账户】——Mysql/PHP/Ajax爬坑之购物车删除选项

    一.引言 做京东账户项目中的购物车模块,功能之三就是删除购物车中的选项.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.依据功能创建库.表.记录 创建库:jd 创建表:购物车表  jd ...

  7. Solidworks如何制作动画1

    1点击窗口下方的"运动算例1"可以弹出动画的面板,右击该"运动算例1"还可以对这个动画窗口重命名等操作. 2 我们从最简单的动画开始,假设图示装配体,想要把它从 ...

  8. 【Python】创建和使用类

    面向对象编程是最有效的软件编写方法之一 创建Dog类 class Dog(): '''一次模拟小狗的简单测试''' def __init__(self,name,age): self.name = n ...

  9. sprint3 【每日scrum】 TD助手站立会议第五天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 通过网上的介绍懂得了闹钟的添加和工作原理,然后加入了震动效果 在添加日程类型处添加了选择闹钟间隔多长时间相应,并写了闹钟运行的类 广播协议也弄 ...

  10. 11-BeautifulSoup库详解

    ---恢复内容开始--- 灵活又方便的网页解析库,处理高效,支持多种解析器. 利用它不用编写正则表达式即可方便地实现网页信息的提取. 这个库有四个主要方法吧,其中xlml是最常用的,他的标签选择器可以 ...