第十五章 调试及安全性(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组件中。
第十五章 调试及安全性(In .net4.5) 之 管理程序集的更多相关文章
- 第十六章 调试及安全性(In .net4.5) 之 调试程序
1. 概述 本章内容包括 如何选择合适的构建类型.创建和管理编译指令.管理程序数据文件(pdb)和指令. 2. 主要内容 2.1 构建类型 .net中默认的两种生成模式是 发布(Release)模式 ...
- 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...
- 第十三章 调试及安全性(In .net4.5) 之 验证程序输入
1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 ...
- 第十七章 调试及安全性(In .net4.5) 之 程序诊断
1. 概述 生产环境中的程序,也是不能保证没有问题的.为了能方便的找出问题,.net提供了一些特性来进行程序诊断. 这些特性包括:logging.tracing .程序性能分析(profiling) ...
- Gradle 1.12用户指南翻译——第四十五章. 应用程序插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 20190901 On Java8 第十五章 异常
第十五章 异常 要想创建健壮的系统,它的每一个构件都必须是健壮的. 异常概念 C++的异常处理机制基于 Ada,Java 中的异常处理则建立在 C++的基础之上(尽管看上去更像 Object Pasc ...
- 15第十五章UDF用户自定义函数(转载)
15第十五章UDF用户自定义函数 待补上 原文链接 本文由豆约翰博客备份专家远程一键发布
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
随机推荐
- X230上安装Yosemite/Win7-黑苹果之路
以前曾经在X230上安装了mavericks,但因为无线网卡问题最终作罢,现在换了SSD(128G).AR9285网卡,又冲刺了一把OSX,折腾了好几天,终于成了.特做记录如下: 首先,硬盘分区问题, ...
- hitTest方法与PointInside方法
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- android 开发进阶自定义控件 类似 TextView
开发自定义控件的步骤: 1. 继承View: 2.重写构造函数并构造方法中获得我们自定义的属性. 3. 重写onDraw, 4.重写onMeasure 等函数 一.自定义View的属性,首先在res/ ...
- 消除PyCharm中满屏的波浪线
PyCharm使用了较为严格的PEP8的检查规则,如果代码命名不规范,甚至多出的空格都会被波浪线标识出来,导致整个编辑器里铺满了波浪线,右边的滚动条也全是黄色或灰色的标记线,很是影响编辑. 在网上看了 ...
- 【测试】手工搭建DG
前言:(一)准备工作: 1.数据库要处于归档模式: 2.监听参数:local_listener 默认值为空--1521 3.关闭闪回(可能会触发数据库的bug,备库不能开闪回) 4.如果有外部表,外部 ...
- Facebook三种分享方式
一.去Facebook开发者中心注册APP,获取APP ID https://developers.facebook.com 二.导入 FBSDKCoreKit.Framework, FBSDKLog ...
- Eclipse中Jsp页面警告的解决方法小结
恩,只要是开发人员,这样的小事情总会遇到的,对于这其中的某些警告性的错误是不影响代码的运行的,对应的功能也是能实现的,不过总给人一种不太好看的感觉!如果代码写的比较符合规范,这些问题也就自然而然的消失 ...
- 学习练习 java 线程
package com.hanqi.xc; import java.util.*; public class lianxi extends Thread { public void run() { c ...
- MongoDB 1: NoSQL 和 SQL的区别
导读:本篇博客,主要是结合自己在项目中的使用,简单的阐述一下NoSQL和SQL的区别.那么,根据自己的应用,NoSQL这边,选择的是MongoDB(Redis虽然也是,但属于内存存储,这里不予说明). ...
- PHP isset()与empty()的区别
PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...