程序集即代码组,可以是单个文件或多个文件,按一个整体部署,但可指定自身调用其他程序集的版本。
  • 推出原因
为解决dll地狱而推出,也可解决其他问题。dll地狱,a应用使用dll版本1,b应用使用dll版本2,传统的com(一般用dll执行)模式,会自动调用最新版本的dll,如果这个dll不向后兼容(大多dll都不向后兼容),导致装了b应用后,a应用不能使用。

.net模式,在程序集中,指定使用哪个版本,在调用时,默认使用指定的版本,解决了dll地狱问题。
  • 程序集信息
主版本,次版本、修订号、内部版本号
公司公钥
程序集人类友好名称
程序清单。包含在一个可执行文件中,或表示为一个独立的文件。
提供的自定义类型
引用其他程序集的信息。名称、版本、区域性和公钥。
  • 类型元数据。程序集提供给外部使用的自定义类型
  • msil代码。各种语言最终被编译成的代码,这代码能被clr执行
  • 资源。通常指图片、本地化翻译文本等被塞入程序集的所有其他文件。
  • 构建程序集
写入上述程序集信息,还可以自定义特性,设置一般特性是[assembly:AttributeName("AttibuteValue")]注意不是语言的一部分,但在程序文件中,不用分号。要引用system.Reflection空间。程序集信息也可以在VS的解决方案管理器,项目文件,右键属性设置。
  • 创建单文件程序集
用csc 程序集文件名 或VS的生成,可生成可执行程序集。在VS,程序集信息保存在AssemblyInfo.cs的单独文件里,特别说明的是公钥,用微软网站上的sn.exe生成,在这个文件里指明路径和文件名mykey.snk,这个公钥文件名需要唯一,不与已有的其他公司或本公司其他公钥相同。
程序集可没有main方法,此时是作为库程序集使用,可用命令行编译为dll,csc \out: 期望文件名  \t:library 源代码文件名
  • 创建多文件程序集
必须用命令行工具创建多文件程序集,使用csc和程序集链接器al。不能为VS内的C#应用程序创建多文件程序集。
C#文件A包含方法,没入口,定义了命名空间namespaceA;文件B包含main,引用了namespaceA;文件C包含程序集清单信息;单独的位图文件D.bmp。
编译文件A成模块文件A.netmodule,没编译成库文件 csc /t:module A.cs;编译文件B,告诉编译器找A文件中的命名空间 csc /addmodule:A.netmodule /t:module B.cs;编译C成单独的模块 csc /t:module C.cs;最后用程序集链接器al将这4个文件一起并入可执行文件 al A.netmodule b.netmodule c.netmodule /embed:D.bmp /main:B.Main /out:A.exe
  • 查看程序集内容
用反汇编命令ildasm outABCD.exe,ILDasm只能反汇编.net文件,也可通过启动微软SDK里的ILDasm查看。
  • 强名称和签名
运行时,用来防止恶意代码代替可信任代码,强名称可保证特定程序集自编译以来,内容是否没有被更改;代码签名,为程序集提供一个信任级。
给程序集指定强名称,就是将公钥加密应用到程序集。公钥加密包括公钥和私钥各一个,公钥全世界公用,私钥是严格保守的秘密。一种加密方法是程序集由公钥加密,再由匹配的私钥解密,这种使用人都有秘密了;另一种方法是程序集由私钥签名,用公钥验证,这种使用人不必有秘密,.net采用这种。
使用强名称中密钥的过程。开发库时,确定程序集的密钥;创建程序集时,把私钥给程序集的哈希;使用程序集的程序,包括这个私钥对应的公钥;运行时,clr用第2个文件的公钥,检验第1个文件中的哈希,是否是预期的私钥签名;随后,哈希可检验第1个文件的内容是否被篡改过(没改过的,能与程序集的文件匹配)。
指定强名称的方法。可以使用sn.exe创建密钥对,-K开关 sn -k A.snk;在程序集的源代码中使用AssenmblyKeyFileAttribute特性;使用al把密钥和程序集链接起来,al A.netmodule b.netmodule c.netmodule /embed:D.bmp /main:B.Main /out:A.exe /t:exe /keyfile:A.snk;另一个程序集使用此程序集,可以在编译那个程序集时,使用/reference开关来检索公钥。
  • 代码签名
强名称判断程序集是否被篡改,保证不了篡改前的最初文件没有恶意代码。这里是第二种安全机制,给程序集添加Authenticode数字签名。使用Authenticode签名的程序集,证明其发行者已经过公认授权机构的证书授权。取得证书授权,需要提供省份证明和一定费用。
准备过程是。.net框架有证书创建工具makecert -n "公司名" -sv 包含证书私钥的文件.pvk 证书名.cer,运行时,会需要指定私钥文件的密码;转换证书cert2spc X_509证书名.cer 软件发行者证书名.spc;文件签名工具signcode给程序集签名,启动向导,选程序集文件,自定义,从文件选择刚才的软件发行者证书.spc文件,指定A.snk私钥文件,私钥密码,散列算法,完成;
证书验证工具chktrust A.exe 运行后,如果不是公认的证书授权机构签发的,会有警告信息,是公认的,会显示是哪个机构授权的。
  • 程序集版本控制
版本号。主版本号1,次版本号0,内部版本号7,修订号(专用号)18914,即1.0.7.18914。
检索版本号。使用system.Reflection空间的AssenblyName类的Version属性,这属性返回一个实例,实例使用4个属性,返回版本号的4个部分。Version v = system.Reflection.Assembly.GetExecutingassembly().getName().version; 用重载的V.Tostring()得到版本号;也可指定磁盘文件名获取版本号。
  • 版本兼容性与策略文件
版本号命名通用标准。新的主版本号和次版本号表示,这个新版本与老版本不兼容,例如3.0.0.0与版本2.4.8.1932不兼容,只要在代码中引入了不相容版本,就应该更改主版本号;新的内部版本号表示可能兼容,在引入服务包或较小规模的升级时,应该更改次版本号;新的修订号表示这是应该安装的、与上一版本相容的快速修补项目。
策略文件。asp.net是web.config;应用是myapp.exe.config。可指定替代版本号,用旧版本号对应新版本号。用VS的管理工具插件framework config配置这个文件,配置程序集,选择程序集,输入新旧版本号。
  • 使用全局程序集缓存
全局程序集类似全局变量,可供多个应用程序使用。
把程序集部署成全局程序集的过程。管理工具,framework configuration,程序集缓存,添加。
  • 查找程序集
由4处决定使用哪个版本的程序集。应用最初指定的版本;应用的策略文件重写版本信息;为所有应用重写的发行者策略文件;系统范围内的管理员策略文件。
优先级。应用已经使用这个程序集,继续使用已使用的版本;如果程序集在全局程序集缓存,使用全局的;应用的策略文件里<codebase>指定的程序集。
 
 

C#-VS程序集的更多相关文章

  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. Oracle 表空间和数据文件之间的关系

    首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件.日志文件和控制文件.数据库的文件为数据库信息提供真正的物理存储. 每 ...

  2. react-router4 第一篇

    无奈,英语4级没过,只能靠猜了.. 首先就是安装了 npm install --save-dev react npm install --save-dev react-dom npm install ...

  3. c# sharpsvn 客户端开发总结

    判断文件夹是否是 working copy 工作副本两个方法 if (!IsWorkingCopy(localPath))//查看某目录是否是受svn管理的状态, 即是否为工作副本 { notiny ...

  4. Eclipse中的maven项目搭建

    一.eclipse中的maven设置 1.打开“首选项”----> "maven"---->"Installations".用来查看maven的使用 ...

  5. 自己动手开启QUIC(转载)

    源:https://www.bennythink.com/quic.html#title-0 今天在推上偶然发现 Google 在自己的服务器上启用了 QUIC,QUIC 这东西嘛(发音同 quick ...

  6. Taxi

    /* After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to cele ...

  7. Python压缩文件夹 tar.gz .zip

    打包压缩生成 XXX.tar.gz 文件 import os import tarfile if os.path.exists(outputFileName): with tarfile.open(o ...

  8. How to make a USB stick use ISO image file in debian

    4.3.1. Preparing a USB stick using a hybrid CD or DVD image Debian CD and DVD images can now be writ ...

  9. Intellij idea 系列教程目录

    Intellij idea 系列教程目录 Intellij idea 系列教程之破解方法 Intellij idea 系列教程之常用快捷键 Intellij idea 系列教程之常用配置项 每天用心记 ...

  10. Metasploit学习

    阶段一:初步渗透 GO! msfconsole 相关漏洞 msf > search platform: windows xp sp3 查看某个漏洞后,查看漏洞详细信息 msf > info ...