zoukankan      html  css  js  c++  java
  • 第十五章 调试及安全性(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:WindowsMicrosoft.NETFrameworkv4.0.30319System.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组件中。

  • 相关阅读:
    Windows 7 X64位平台下,VC6调试运行程序,中断调试无法退出
    在Windows中安装MinGW-w64(有图,一步一步)
    自我修养
    Core 事件总
    异步消息
    微信小程序
    安装Zookeeper集群
    Linux删除非空目录
    adoop集群动态添加和删除节点
    安装和配置hadoop集群步骤
  • 原文地址:https://www.cnblogs.com/stone_lv/p/4384644.html
Copyright © 2011-2022 走看看