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

程序集的概述

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. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

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

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

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

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

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

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

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

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

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

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

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

  7. “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

    除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性" ...

  8. 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。

    在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...

  9. 未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件

    ASP.NET 运行时错误:针对类型System.Web.Mvc.PreApplicationStartCode的应用程序邓启动初始化方法Start 引发了异常,显示下列错误消息: 未能加载文件或程序 ...

  10. 比较.NET程序集(DLL或EXE)是否相同

    如何比较两个.NET程序集(DLL或EXE)是否相同呢? 直接比较文件内容?当然没那么简单了,这个你可以去试试,去比较一下两次Build产生的程序集, 就算内容没有改变,产生的程序集的二进制文件也是不 ...

随机推荐

  1. .net Core 1.0.1 下的Web框架的的搭建过程step by step

    环境:ubuntu+VScode  数据库:mysql ,ORM框架:chloe 官网 看完本篇文章你能学会 在Vscode下创建项目,一些基础的命令 ,以及得到一个配置文件的简单读取实例 1,在VS ...

  2. python中input()与raw_input()的区别到底是啥?-----marsggbo原创作品为你解答

    首先先给出总结:input () = int(raw_input()) 有图有真相!!! 先看看input的例子: 可见用input键入得到int类型的数据,那如果输入一些非int类型的会怎么样呢? ...

  3. Windows上安装Kafka需要注意的几点

    1.不能安装在有空格的路径上 比如:D:\Program Files 2.设置日志路径时,要用"/",不能用Windows上的"\",比如: # A comma ...

  4. js两个判断&&的值与||的值

    var value1="val1"; var value2="val2"; alert(value1&&value2);    //结果为val ...

  5. sql 语句写的行列转换

    以前面试老遇到一个行列转换的问题,今天没事,顺便记录一下 假设有这样一张表,如下图,创建表就不说了,直接建或者SQL语句都行 sql语句如下 --第一种 select name as 姓名, max( ...

  6. Oracle常见错误集锦

    1.ORA-12560:TNS:协议适配器错误 OracleService<SID>服务没有启动 2. ORA-12541:TNS:无监听程序 Oracle<ORACLE_HOME& ...

  7. MYSQL数据库导入大数据量sql文件失败的解决方案

    1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...

  8. Android IPC机制全解析<一>

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  9. c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类

    有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...

  10. ServerSuperIO 3.5版本的体系结构,以及未来规划的几点思考

    一.特点 1.轻型高性能通信框架,适用于多种应用场,轮询模式.自控模式.并发模式和单例模式. 2.不仅是通讯框架,是设备驱动.IO通道.控制模式场景的协调机制. 3.支持协议驱动器,可以按规范写标准协 ...