第十五章 调试及安全性(In .net4.5) 之 管理程序集

1. 概述

  本章将介绍 什么是程序集、如何强命名程序集、如何把程序集放入GAC、程序集版本 以及 WinMD程序集。

2. 主要内容

  2.1 什么是程序集

    程序集(Assembly)概念的出现,是为了解决COM时代的各种问题的。

    ① 程序集是自包含的。不需要写入注册表或其他位置。

    ② 程序集是语言无关的。由中间语言组成,可以被.net支持的各种语言编写的程序使用。

    ③ 程序集支持多个版本。

    ④ 程序集支持简单拷贝的发布方式。

  2.2 强命名程序集

    CLR支持两种类型的程序集:强命名程序集 和 常规程序集

    强命名程序集的几个好处:

    ① 确保唯一。用自己的唯一私钥生成的强名称,确保唯一性。

    ② 确保版本的纯净。需要用自己的私钥才能发布新版本,别人无法发布。

    ③ .net平台会监测强命名程序集的改动。

    可以使用命令行或者Visual studio来强命名程序集。

    可以使用Strong Name Tool(SN.exe) 来查看强命名程序集的公钥信息。

    C:\>sn -Tp C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll

    使用延迟签名,可以更好的保护私钥不被泄露。

    使用强命名也不能完全确保程序集的发布者身份,使用数字证书来签名程序才可以确保这一点。

  2.3 将程序集放入GAC

    全局程序集缓存 global assembly cache(GAC) 中的程序集可以被多个程序使用,安全性更好,并且可以保存同一程序集的不同版本。

    发布程序集到GAC有两种途径:

    ① 生产环境,使用指定的安装程序,比如 Windows Installer 2.0。

    ② 开发环境,使用 Global Assembly Cache tool (Gacutil.exe);

  2.4 程序集版本

    每个程序集的版本号都包括以下部分:

    {Major Version}.{Minor Version}.{Build Number}.{Revision}

    ① 可以使用 Publisher Policy Files 来配置跳过指定的版本号。

<configuration>
   <runtime>
      <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1”>
       <dependentAssembly>
         <assemblyIdentity name=”myAssembly”
                           publicKeyToken=”32ab4ba45e0a69a1”
                           culture=”en-us” />
         <!-- Redirecting to version 2.0.0.0 of the assembly. -->
         <bindingRedirect oldVersion=”1.0.0.0”
                          newVersion=”2.0.0.0”/>
       </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

    ② 可以配置probing节点或者codebase节点来指定程序目录外的位置,运行时CLR会去指定的位置查找程序集。

<configuration>
  <runtime>
    <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1”>
      <probing privatePath=”MyLibraries”/>
    </assemblyBinding>
  </runtime>
</configuration>
<configuration>
  <runtime>
    <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1”>
      <dependentAssembly>
        <codeBase version=”1.0.0.0”
          href= “http://www.mydomain.com/ReferencedAssembly.dll”/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

    *probing只能指定跟程序目录相关的位置。如果需要指定其他位置,请用codeBase。

  2.5 创建WinMD程序集

    因为有的组件(比如native c++编写的组件)不包含元数据,但是元数据又是多语言组件交互的必需品,为了解决这个问题,微软创建了一个新的文件类型 Windows Metadata(WinMD) .

    可以在Visual Studio中创建一个Windows Runtime component,然后编译获得一个 .winmd 文件。

    创建Windows Runtime component时有几个限制:

    ① 组件的 字段、参数 和 所有公共属性及方法的返回值都必须是Windows Runtime类型。

    ② 公共的类和接口可以包含方法、属性 和 事件,但是不能是泛型类、不能实现非Windows Runtime接口、不能从Windows Runtime之外的类型派生。

    ③ 公共的类必须是密封类。

    ④ 公用的结构只能包含公共字段,并且字段类型只能是值类型或者string类型。

    ⑤ 所有的公共类型必须有一个跟程序集匹配的根命名空间名,并且不能以Windows开头。

3. 总结

  ① 程序集是一个包含元数据的代码编译单元。

  ② 可以强命名一个程序集来避免程序集内容被篡改。

  ③ 强命名签名的程序集可以放到GAC中。

  ④ 一个程序集可以存在多个不同的版本供其他程序使用。可以以配置的方式修改其中的绑定关系。

  ⑤ WinMD是一种特殊的程序集,WinRT用它来将非原生语言映射到原生WinRT组件中。

时间: 2024-10-20 07:40:41

第十五章 调试及安全性(In .net4.5) 之 管理程序集的相关文章

第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密

1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同一个密钥来加密和解密数据,密钥的安全传输是一个很重要的问题. ② 非对称加密:使用两个关联的密钥(公钥和私钥),公钥公开,私钥保密.用公钥加密的信息可以用私钥解密,反之亦然. ③ 对称加密 速度快,适用大数据量情况.使用两种加密算法的组合方式,可以实现大数据的加密传输. *密钥之外的另一种加密方式是

第十三章 调试及安全性(In .net4.5) 之 验证程序输入

1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 2.1 验证程序输入的重要性 ① 正常用户的错误输入 ② 恶意用户的攻击 ③ 集成的其他系统的变动 2.2 管理数据完整性 ① 记录完整性:一般是数据库中的一条记录,需要用主键标记. ② 取值完整性:一个数据项所允许的数据范围. ③ 引用完整性:相关的记录项引用关系要保持完整. ④ 自定义的完整性:

Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu

20190901 On Java8 第十五章 异常

第十五章 异常 要想创建健壮的系统,它的每一个构件都必须是健壮的. 异常概念 C++的异常处理机制基于 Ada,Java 中的异常处理则建立在 C++的基础之上(尽管看上去更像 Object Pascal). 基本异常 异常参数 所有标准异常类都有两个构造器:一个是无参构造器:另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器. Throwable 是异常类型的根类. 自定义异常 对异常来说,最重要的部分就是类名. 异常与记录日志 对于异常类来说,getMessage() 方法有点

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

第十五章 链表

/** 数组与链表的区别:数组易随机访问,链表易插入和删除 链表组成:储存数据元素的数据域,储存下一结点地址的指针域 链表易于插入与删除 lists 的用法????????????????????? *///建立一个图书链表 #include<iostream> #include <string> using namespace std; struct book //第一步: 用于建立节点. class 默认为私有 struct 默认为公有 //节点组成:①数据域 ②指针域(*ne

java(第十五章)

第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值"); 3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase(