AssemblyInfo.cs的作用
总结:用来设置项目生成的dll的常规信息。(如版本、版权等等)它就相当于一个资源文件,存放资源信息。
http://www.cnblogs.com/xuyuantao/articles/927285.html
AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数请看以下具体说明:
//备注:
[assembly:AssemblyDescription("用最强的抢劫类写成!")]
//产品名称
[assembly:AssemblyProduct("产品名称 ")]
//公司
[assembly:AssemblyCompany("公司")]
//合法商标
[assembly:AssemblyTrademark("合法商标")];
//内部名称
[assembly:AssemblyCulture("")]
//设计者
[assembly:AssemblyDescription("设计者 ")]
//版权
[assembly:AssemblyCopyright("版权")]
//配置文件
[assembly:AssemblyConfiguration("Configuration")]
//产品版品: 可指定,如下
// 程序集的版本信息由下列 4 个值组成: //
// 主版本
// 次版本
// 内部版本号
// 修订号 //
// 您可以指定所有这些值,也可以使用“修订号”和“内部版本号”的默认值,方法是按
// 如下所示使用 '*': [assembly:AssemblyVersion("1.0.*")] 生成dll文件以后再点击右键看看它的属性,你就为在里面看到熟悉的内容了.
如果你使用.NET作为开发工具很长时间了,你肯定回会碰到“强名”(strong name)这个概念。这个概念并不意味你的组件命名方式必须类似于MyCompany.Gorilla.Biceps的方式。强名的力量体现在对组件的保护方面,.NET Framework使用强名来标识组件和保护组件使其免遭破坏。在这篇文章中我将说明如何建立强名,以及在.NET中使用强名的技巧。
1. 散列和签名 为了了解强名的工作原理,你必须首先理解密码学方面的两个概念:散列(hashing)和数字签名(digital signatures)。散列是用来为明文(plaintext)信息创建一个唯一的压缩的值。这里的“信息”是一个很广泛的概念,对于组件来说,信息就是它本身。如图1所示,信息作为散列作为散列算法的输入而被处理,对于强名情况,采用SHA1算法。
散列是不可逆的,一旦计算出来,是不可能解密的。但是,散列在比较值方面是非常有用的。如果两个组件生成同样的散列值,你可以认为这两个组件是相同的。相反,通过散列计算出来的值和以前计算的值不一样,说明组件中某个地方被修改了。 因此通过散列值你就可以知道,组件是否被修改或破坏。然而你怎样通过散列值来防止别人对你的组件的修改呢?下面就是我要讲的“数字签名”。 虽然数字签名的具体数学原理很复杂,但是概念很简单。一个数字签名依赖于两个相关的数字:公共秘匙(public key)和私有密匙(private key)。如图2所示,当数据通过公共秘匙加密后,它只能通过私有密匙来解密,反之亦然。
2. 组件的强名 在.NET中共同使用散列和数字签名就能够保护你的组件免遭破坏。其原理如图3所示,首先从组件产生一个散列值,然后这个散列值通过你的私有密匙被加密,然后这个散列值和公共密匙被一起防止在组件中。
在运行的时候,公共语言运行时(CLR)通过比较散列值验证组件。首先公共的密匙用来解密散列,从当前的组件中计算出一个新的散列。如果它和原来的值吻合,那就通过了验证
那么如果一个组件在签名之后被破坏将会发生什么样的情况呢?显然,在运行时从组件中计算出来的散列值将不会与存储在组件中通过私有密匙加密的散列值吻合,这样公共语言运行时将拒绝加载该组件。
注意强名只是保证了组件的完整性,而并非它的安全性,没有什么办法来防止某个人创建一个恶意的组件,并通过强名来给它签名。你可以通过强名来验证某个组件在签名后是否被破坏。基于你对于信息的选择。这一切将由你来决定是否相信从某个地方来的组件和代码信息。
3.强名的其它信息
除了从组件内容求出来的散列,强名还包含一下三个方面的信息。
l 组件简单文本名称
l 组件版本号
l 组件的语言文化代码
所有的这些信息,将为每个组件提供唯一的标识。有了这些信息,公共语言运行时可以决定一个组件是否被另一个组件通过引用的方式调用。当你从一个组件引用另一个组件,该组件将存储被调用组件的公共密匙。在运行的时候,公共语言运行时将通过这些来判断该组件是否来自正确的供应商。另外强名中的其它信息用来判断组件是否符合引用的绑定策略(binding policy)的要求。
4.使用强名的技巧
.NET Framwork SDK和 Visual Studio.NET为指定强名提供了很多的工具,这是很有意义的,因为通过Visual Studio.NET来创建组件具有更多的选择。在你签名之前你必须创建一对密匙(公共密匙和私有密匙),通常密匙对放置在以.snk结尾的文件中。可以通过强名工具sn.exe来实现。
sn -k MyKeyFile.snk
如果你使用命令行编译器(vbc.exe或者csc.exe),你就可以为组件连接器al.exe,指定密匙对。如下面的命令行所示,你可以将存储在MyKeyFile.snk中的密匙对作为MyFile.dll的签名。
al /out:MyFile.dll MyFile.netmodule /keyfile:MyKeyFile.snk
如果你使用Visual Studio .NET,你仍然可以通过命令行的方式产生你的密匙对。有了密匙对之后你就可以通过设定在组件信息文件(AssemblyInfo.vb 或者semblyInfo.cs)的【AssemblyKeyFile】属性来把它包含到组件中。例如C#工程,你可以通过该属性包含密匙文件而生成一个签名组件。
[assembly: AssemblyKeyFile("..\\..\\MyKeyFile.snk")]
从被编译的组件到密匙文件,【AssemblyKeyFile】属性中的文件名必须包含完整的相对路径。
5.通过延迟签名加密
保护你的私有密匙是非常重要的,如果某个恶意的人取得了你的密匙,他生成的组件将和你签过名的组件一样。因此,应当把你的密匙设于高度的保密状态,公司里面可能就只有几个人知道。这样以来,又怎么给你的组件签名呢?如果就只有你一个人知道密匙,这样会很繁琐,因为你必须为公司中每个开发者开发出来的每个组件签名。
很幸运的是.NET为这个问题提供了一个很好的方法:延迟签名。通过延迟签名,你可以在只知道公共密匙的情况下创建和测试组件。只有在组件实际分发给用户时才将私有密钥匙包含到组件。下面是使用延迟签名过程的一些技巧总结:
1. 从公共/私有密钥匙对中提取公共密匙。为了提取公共密匙,也就是存储公共/私有密匙对,你可以使用强名工具,命令行如下:
sn.exe -p MyKeyFile.snk MyPublicKeyFile.snk
2. 将包含公共密匙的文件分发给公司所有的开发者,同时将包含公共/私有密钥匙对的文件安全存放。
3. 在组件信息文件中包含公共密匙的文件,并注明延迟签名。
[assembly: AssemblyDelaySign(true)]
[assembly: AssemblyKeyFile("..\\..\\MyPublicKeyFile.snk")]
如果你使用组件连接工具,而非Visual Studio .NET,你可以使用/delaysign命令行来表明延迟签名。
4. 如果你把组件保存在全局程序集缓存(GAC)中,应关闭对组件的验证,因为GAC默认验证每个组件的强名。如果组件没有采用私有密钥匙来签名,这个验证将会失败。因此,出于开发和测试的目的你可以输入如下的命名行:
sn.exe -Vr MyFile.dll
5. 这样,你就可以在开发和测试的时候很自由的使用组件
6. 当部署一个延迟签名的组件的时候,你必须通过私有密匙来给它签名。
sn.exe -R MyFile.dll MyKeyFile.snk
7. 最后,你必须通知GAC重新开启对组件的验证。命名行如下:
sn.exe -Vu MyFile.dll
6.可信任计算(TrsutWorthy Computing)
你肯定听说过微软的“可信任计算”措施,它包含了有关微软产品的很多安全方面的措施。微软正慢慢的而且必然的朝着一个方向发展,那就是他们将使他们所有的软件产品是默认安全的。如果你知道你在做什么,你就可以降低软件(如Windows Server 2003)的安全级别。虽然降低了安全级别,但太可能使你受到突发事件的攻击。
当你给你的组件赋予强名,你在做就是“可信任计算”。通过强名来分发你的组件,会使得组件不太可能成为木马和其他攻击计算机黑客程序的载体。.NET Framework和Visual Studio .NET提供的工具保证了你分发组件的完整性。因此我强烈建议你使用这些工具,通过这些工具来使得计算世界变得更安全一点。
AssemblyInfo.cs的作用的更多相关文章
- AssemblyInfo.cs文件的作用
在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些參数,以下是默认的AssemblyInfo.cs文件的内容详细介绍 //是否符合公共 ...
- .Net魔法堂:AssemblyInfo.cs文件详解
一.前言 .net工程的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作该文件.那就是通过在鼠标右键点 ...
- AssemblyInfo.cs文件参数具体讲解
在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...
- [0] AssemblyInfo.cs文件介绍
AssemblyInfo.cs文件:包含程序版本.信息.版权的属性文件 先介绍AssemblyInfo.cs文件中的程序集属性 内容: using System.Reflection;using Sy ...
- WinForm中AssemblyInfo.cs文件参数具体讲解
在.NET中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共语言规 ...
- AssemblyInfo.cs文件详解
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq395537505/article/details/49661555 一.前言 .net工程的Pr ...
- c#程序中的AssemblyInfo.cs
在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...
- [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute
剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...
- 修改AssemblyInfo.cs自动生成版本号
一. 版本号自动生成方法 1.把 AssemblyInfo.cs文件中的[assembly:AssemblyVersion("1.0.0.0")]改成[assembly:Assem ...
随机推荐
- form程序的界面修改
做主题视频库的界面的修改工作,是b/s端的窗口,是由form窗口生成,如下截图: 主要有三个方面,1.左侧菜单栏宽度固定,不随整个窗口大变化而变化.2.导出excel按钮的位置的移动,不管整个窗口是变 ...
- JavaScript之模块化编程
前言 模块是任何大型应用程序架构中不可缺少的一部分,模块可以使我们清晰地分离和组织项目中的代码单元.在项目开发中,通过移除依赖,松耦合可以使应用程序的可维护性更强.与其他传统编程语言不同,在当前Jav ...
- [转]Java8-本地缓存
这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值.非常完美的实现cach ...
- oracle数据泵备份(Expdp命令)[转]
Oracle备份方式主要分为数据泵导出备份.热备份与冷备份三种,今天首先来实践一下数据泵备份与还原.数据泵导出/导入属于逻辑备份,热备份与冷备份都属于物理备份.oracle10g开始推出了数据泵( ...
- hduacm 2888 ----二维rmq
http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题 直接用二维rmq 读入数据时比较坑爹 cin 会超时 #include <cstdio& ...
- 从BlackHat2013中我们收获了什么
拉斯维加斯-BlackHat全球黑客大会是每年围观革新安全技术的最好机会,还能和那些 在这个行业里聪明至极的家伙交谈并从中得到些关于前沿技术的动向和启示.今年的会议无论参会人数还是议题数量是历届规模最 ...
- 注册表 ReadBool类型和 ReadInteger 的关系
function TRegistry.ReadBool(const Name: string): Boolean; begin Result := ReadInteger(Name) <> ...
- 学好C++必须要注意的十八个问题
转自 http://blog.chinaunix.net/uid-7396260-id-2056691.html 一.#include "filename.h"和#i nclud ...
- [处理器、单片机]ARM
1.ARM简介: ARM是Advanced RISC Machines的缩写.1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生,由美国加州San Jose VLSI技术公 ...
- Iterator和ListIterator的区别
Iterator是ListIterator的父接口. Iterator是Collection中取元素的方式,ListIterator局限于List Iterator只有hasNext(),next() ...