C#笔记29:程序集、应用程序配置及App.config和YourSoft.exe.config

简介: C#笔记29:程序集及应用程序配置及App.config和YourSoft.exe.config 本章概要: 1:什么是程序集 2:程序集标识属性 3:强名称的程序集 3.1:强名称工作原理 4:配置文件 5:使用 DEVPATH 查找程序集 6:指定要使用的运行库版本 7:App.config和YourSoft.exe.config   1:什么是程序集      程序集是 .NET Framework 应用程序的构造块;程序集构成了部署、版本控制、重复使用、激活范围控制和安全权限的基本单元。

C#笔记29:程序集及应用程序配置及App.config和YourSoft.exe.config

本章概要:

1:什么是程序集

2:程序集标识属性

3:强名称的程序集

3.1:强名称工作原理

4:配置文件

5:使用 DEVPATH 查找程序集

6:指定要使用的运行库版本

7:App.config和YourSoft.exe.config

 

1:什么是程序集

     程序集是 .NET Framework 应用程序的构造块;程序集构成了部署、版本控制、重复使用、激活范围控制和安全权限的基本单元。程序集是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻辑功能单元。程序集向公共语言运行库提供了解类型实现所需要的信息。

     程序集属性是提供程序集相关信息的值。属性分为以下几组信息:

  • 程序集标识属性。

  • 信息性属性。

  • 程序集清单属性。

  • 强名称属性。

2:程序集标识属性

     三种属性与强名称(如果适用)一起决定程序集的标识:名称、版本和区域性。这些属性构成程序集的完整名称,并且在代码中引用程序集时需要这些属性。您可以使用属性来设置程序集的版本和区域性。编译器或程序集链接器 (Al.exe) 根据包含程序集清单的文件在创建程序集时设置名称值。  

     有关程序集属性的更多信息,参看http://msdn.microsoft.com/zh-cn/library/4w8c1y2s(VS.80).aspx

 

3:强名称的程序集

     强名称是由程序集的标识加上公钥和数字签名组成的,其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。它使用对应的私钥从程序集文件中生成。(程序集文件包含程序集清单,其中包含组成程序集的所有文件的名称和哈希。)

     具有强名称的程序集只能使用其他具有强名称的程序集的类型。否则将会危及到该具有强名称的程序集的安全。

 

3.1:强名称工作原理

签名机制
1. 用SN.exe 生成一个key文件, 这个key文件包括一个public key 和一个private key.
2. 用这个key文件签名assembly时, 编译器将用private key签名程序集, 并将public key嵌入manifest中
3. 编译器哈希manifest中所有的assembly内容, 并将此哈希值各自assembly的FileDef Talbe中.
4. 当如上3步处理后, 编译器将哈希PE文件的整个内容(除authenticode signature, 强名称数据, PE头), 然后将此哈希值用private key签名. 得到RSA数字签名.
5. 将此数字签名嵌入到PE文件的CLR头

防修改机制
1. 当签名后的assembly安装到GAC, 系统会哈希PE文件(同签名), 得到哈希值
2. 系统读取PE文件中CLR头中的RSA签名, 并用public key(包含在manifest中)解密
3. 比较第1步得到的哈希值和第2步得到解密值是否一致, 从而判断其是否被修改.

 

4:配置文件

     配置文件是可以按需要更改的 XML 文件。开发人员可以使用配置文件来更改设置,而不必重编译应用程序。管理员可以使用配置文件来设置策略,以便影响应用程序在计算机上运行的方式。

     配置文件更多内容查看http://msdn.microsoft.com/zh-cn/library/1xtk877y(VS.90).aspx

 

5:使用 DEVPATH 查找程序集

     开发人员可能想确保他们正在生成的共享程序集能与多个应用程序一起正常使用。在开发周期内开发人员不用频繁地将程序集放在全局程序集缓存中,他们可以创建 DEVPATH 环境变量,让该变量指向程序集的生成输出目录。

     例如,假设您正在生成名为 MySharedAssembly 的共享程序集,且输出目录是 C:\MySharedAssembly\Debug。可以将 C:\MySharedAssembly\Debug 置于 DEVPATH 变量中。然后必须在计算机配置文件中指定 <developmentMode> 元素。该元素告诉公共语言运行库使用 DEVPATH 来查找程序集。

     共享程序集必须能够由运行库发现。 若要指定用于解析程序集引用的私有目录,请在配置文件中使用 <codeBase> 元素<probing> 元素,如 指定程序集的位置 中所述。 还可以将程序集放在应用程序目录的子目录中。有关更多信息,请参见运行库如何定位程序集

     下面的示例说明如何使运行库在由 DEVPATH 环境变量所指定的目录中搜索程序集。

<configuration>
  <runtime>
    <developmentMode developerInstallation="true"/>
  </runtime>
</configuration>

6:指定要使用的运行库版本

<?xml version ="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v1.1.4322" /> 
  </startup>
</configuration> 

 

7:App.config和YourSoft.exe.config

     为了更加快速的使用配置信息而不自己写代码实现读写,我们在创建应用程序的时候应该使用App.config。创建完毕后,我们发现App.config的属性是:

image_thumb[1]

     以上是创建App.config后的默认设置,不要修改这些属性,编译你的解决方案,会在输出目录中发现生成了一个YourSoft.exe.config(假设你的应用程序名为YourSoft.exe)。下面有几点需要说明:

     1:YourSoft.exe.config其实对应的就是你解决方案中的App.config。注意,千万不要以为在输出目录中它也会以App.config存在。

     2:如果“复制到输出目录”属性你设置的是“复制”或者“较新则复制”,则App.config会被复制到输出目录。千万不要以为在输出目录中的App.config对应用程序会有任何意义。运行时默认还是会去读YourSoft.exe.config。

     3:输出目录中YourSoft.exe.config的值不会自动保持和你解决方案中的App.config内容一致。你需要手动去设置YourSoft.exe.config中的值。


练习:

1.You are creating a strong-named assembly named Asse  mbly1 that will be used in multiple applications.

Assembly1 will be rebuilt frequently during the development cycle. You need to ensure that each time the 
assembly is rebuilt it works correctly with each application that uses it. You need to configure the computer on
which you develop Assembly1 such that each application uses the latest bu  ild of Assembly1. Which two actions
should you perform? (Each correct answer presents part of the solution. Choose two.)
A. Create a DEVPATH environment variable that points to the build output directory for the strong-named       
assembly.
B. Add the following XML element to the machine configuration filE.          
<developmentMode developerInstallation="true"/>

C. Add the following XML element to the machine configuration filE.         
<dependentAssembly>    
<assemblyIdentity name="Assembly1" publicKeyToken="32ab4ba45e0a69a1" language="en-US" 
version="*.*.*.*" />
<publisherPolicy apply="no" />    
</dependentAssembly>
D.  Add the following XML element to the configuration file of each application that uses the strong-named       
assembly:  
<supportedRuntime version="*.*.*.*" /> 
E. Add the following XML element to the configuration file of each application that uses the strong-named   
assembly:    
<dependentAssembly>     
<assemblyIdentity name="Assembly1" publicKeyToken="32ab4ba45e0a69a1" language="en-US" 
version="*.*.*.*" />       
<bindingRedirect newVersion="*.*.*.*"/>    
</dependentAssembly>
Answer: A, B

 

2.Your company uses an application named Application1 that was compiled by using the .NET Framework
version 1.0. The application currently runs on a shared computer on which the .NET Framework versions 1.0 and     
1.1 are installed.     You need to move the application to a new computer on which the .NET Framework versions 
1.1 and 2.0 are installed. The application is compatible with the .NET Framework 1.1, but it is incompatible with   
the .NET Framework 2.0. You need to ensure that the application will use the .NET  Framework version 1.1 on the 
new computer. What should you do?   

A.  Add the following XML element to the application configuration file.       
<configuration>     
<startup>       
<supportedRuntime version="1.1.4322" />      
<startup>   
</configuration>

B. Add the following XML element to the application configuration file.       
<configuration>     
<runtime>       
<assemblyBinding  xmlns="urn:schemas-microsoft-com:asm.v1">         
<dependentAssembly>             
<assemblyIdentity name="Application1" 
publicKeyToken="32ab4ba45e0a69a1"  culture="neutral" />             
<bindingRedirect oldVersion="1.0.3075.0" newVersion="1.1.4322.0"/>           
</dependentAssembly>      
</assemblyBinding>   
</runtime>  
</configuration>
C. Add the following XML element to the machine configuration file.          
<configuration>     
<startup>       
<requiredRuntime version="1.1.4322" />       
<startup>   
</configuration>

D.  Add the following XML element to the machine configuration file.          
<configuration>     
<runtime>       
<assemblyBinding  xmlns="urn:schemas-microsoft-com:asm.v1">   
<dependentAssembly>             
<assemblyIdentity name="Application1" 
publicKeyToken="32ab4ba45e0a69a1"  culture="neutral" />             

<bindingRedirect oldVersion="1.0.3075.0" newVersion="1.1.4322.0"/>           
</dependentAssembly>      
</assemblyBinding>   
</runtime>  
</configuration>
Answer: A

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
5月前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
196 0
|
10月前
|
存储 SQL 虚拟化
Omnissa App Volumes 4, version 2503 - 实时应用程序交付系统
Omnissa App Volumes 4, version 2503 - 实时应用程序交付系统
232 7
Omnissa App Volumes 4, version 2503 - 实时应用程序交付系统
|
12月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
766 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
7月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
280 1
|
12月前
|
机器学习/深度学习 存储 人工智能
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
MNN-LLM App 是阿里巴巴基于 MNN-LLM 框架开发的 Android 应用,支持多模态交互、多种主流模型选择、离线运行及性能优化。
9562 80
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
|
7月前
|
存储 移动开发 监控
App Trace功能实战:一键拉起、快速安装与免提写邀请码的应用实践
App Trace系统通过一键拉起、快速安装和免提写邀请码三大功能,显著提升用户转化率、安装成功率和邀请注册率。结合深度技术实现与优化,助力公司用户增长,成为移动端核心基础设施。
|
9月前
|
搜索推荐 API UED
淘宝/天猫获得淘宝app商品详情原数据 API 返回值的应用
该API专注于商品信息整合与展示,提供基础信息抓取、多媒体内容整合等功能,助力实时同步商品数据,构建丰富的详情页。同时支持数据分析与市场洞察,包括销售趋势分析和竞品对比,优化库存与定价策略。此外,动态促销管理和个性化推荐系统可提升营销效果,而实时库存预警和评价数据可视化则显著增强用户体验,为用户决策提供透明依据,全面提升平台竞争力与用户满意度。
|
11月前
|
小程序
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
759 1
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
807 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
385 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章