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

程序集的概述

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. Android Studio +MAT 分析内存泄漏实战

    对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些已经不使用的对 ...

  2. PHP生成月历代码

    <?php /*   Function Written by Nelson Neoh @3/2004.   For those who wants to utilize this code, p ...

  3. EasyMvc入门教程-基本控件说明(1)按钮

    按钮是我们最常用的控件之一了,先看下我们提供的按钮风格: 不同颜色的: 实现代码: @Html.Q().Button().Text("Danger").ColorDanger() ...

  4. implement-stack-using-queues(easy,但也有思考价值)

    https://leetcode.com/problems/implement-stack-using-queues/ 还有种方法,就是利用同一个队列,知道队列长度前提下,把内容从头到尾,再向尾部依次 ...

  5. web.config配置数据库连接 【转】

    http://www.cnblogs.com/breezeblew/archive/2008/05/01/1178719.html 第一种: 取连接字符串 = System.Web.Configura ...

  6. 2017.2.21 activiti实战--第七章--Activiti与spring集成(一)配置文件

    学习资料:<Activiti实战> 第七章 Activiti与容器集成 本章讲解activiti-spring可以做的事情,如何与现有系统集成,包含bean的注入.统一事务管理等. 7.1 ...

  7. TCP/IP详解 卷一(第六章 ICMP:Internet控制报文协议)

    ICMP是(Internet Control Message Protocol)Internet控制报文协议. 用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可达.路由是否可 ...

  8. 【Excle数据透视】如何用含有单元格的数据来创建数据透视

    取消合并单元格,填充相同内容项,然后创建数据透视表. 如下图:需要使用数据创建数据透视表 步骤一 开始→格式刷,然后对单元格区域G2:G15使用格式刷功能,保留合并单元格格式 步骤二 选中A2:A18 ...

  9. JS创建表单提交备份

    //保存 function saveFT() { var data = { createDate: GetDateStr(0), name: $("#txtName").val() ...

  10. Vue.js 很好,但会比 Angular 或 React 更好吗?

    文章转自:http://www.oschina.net/translate/vuejs-is-good-but-is-it-better-than-angular-or-rea Vue.js 是一个用 ...