强名称程序集(strong name assembly)——为程序集赋予强名称

         引言

                 在以前的项目开发中,在程序集中见到过一个后缀为*.snk的文件,当时看这个文件的图标,感觉可能是企业内部保护版权啥的一种方式。

  一,强程序集解决了哪些问题?

1,唯一标识一个程序集

2,放置程序集被仿冒和被篡改。

3,可以部署到全局程序集缓存(GAC:GlobalAssembly Cache)中;在将强名称程序集不熟在GAC当中以后,强名称程序集也可以称为共享程序集(shared assembly)

二,强名称与GAC

        

强名称:

定义了一个规则,不单单以文件名来区分程序集,这个规则就是强名称。

 

GAC:

定义一个特殊的文件夹,这个文件夹能够识别这种规则,并且允许文件名相同的文件存在,这个特殊的文件夹就是GAC。

三,为程序集赋予强名称

         打开VS 开发人员命令提示工具:

              首先,我们来创建公钥私钥文件,使用 sn -k命令:

             

         然后我们会发现在此文件夹下创建LHC.snk成功:

           

需要注意的地方:

1,每次调用sn时候,创建的私钥/密钥对文件都不相同,不仅自己的计算机每次生成的不同,其他所有计算机生成的也不相同。

2,关于这个文件的命名,如果是个人,可以以自己的名字命名;如果是团队,,组织火公司,可以以组织名称来命名。

3,在大多数情况下,个人和组织只需要一个snk文件就可以了,以后创建强名称的时候,都使用这个snk文件。由于会使用snk文件的私钥对强名称程序集进行签名,因此这个文件必须严密保护。

 

上面创建的LHC.snk里面既包含公钥,也包含私钥。公钥可以使用sn.exe查看,但是私钥无法查看。

    如果需要查看公钥的话,可以使用 sn -p命令:

    

      之后使用sn -tp命令查看*.pk文件:

     

     创建好这个公钥私钥文件之后,我们就可以使用它来标识程序集的唯一性了。

     在需要设置的程序集中,为此程序集设置签名属性:

        

       保存之后再观察此程序集,会发现多出来一个文件:

      

时间: 2024-08-04 01:12:29

强名称程序集(strong name assembly)——为程序集赋予强名称的相关文章

关于程序集生成失败 -- 引用的程序集没有强名称的解决办法

关于程序集生成失败 -- 引用的程序集没有强名称的解决办法   我在PetShop4程序中加入了一个业务外观层,然后在业务逻辑层(PetShop.BLL)引用这个程序集,点"生成",出现以下的错误:"程序集生成失败 -- 引用的程序集没有强名称",原因是PetShop.BLL是强命名程序集,强命名程序集不能用普通程序集造成的.         那么什么叫强命名程序集呢?我们知道,以前在Windows下开发程序时常会遭遇著名的"DLL Hell"问

引用owc时出现“程序集生成失败 -- 引用的程序集“Interop.OWC10”没有强名称” (在线等)

问题描述 引用owc时出现"程序集生成失败--引用的程序集"Interop.OWC10"没有强名称"(在线等) 解决方案 解决方案二:该回复于2007-12-04 11:20:09被版主删除解决方案三:你自己的项目是不是强名称的,如果是先不要搞成强名称的.解决方案四:mark解决方案五:友情顶一下解决方案六:owc控件是microsoftoffice图表控件(owc10为ofiiceXP的组件.owc11为office2003的组件,组件的路径为C:ProgramF

引用owc时出现“程序集生成失败 -- 引用的程序集“Interop.OWC10”没有强名称”

问题描述 引用owc时出现"程序集生成失败--引用的程序集"Interop.OWC10"没有强名称"在线等 解决方案 解决方案二:该回复于2007-12-04 11:20:09被版主删除解决方案三:相关资料:

程序集生成失败 -- 引用的程序集“Interop.JRO”没有强名称

问题描述 程序集生成失败--引用的程序集"Interop.JRO"没有强名称这个怎么解决了,查了很多资料就是没有解决

程序集防篡改,进行程序集签名的问题

问题描述 对于.Net的客户端程序,总是那么不保险,想用程序集签名的方式防止客户端程序集被篡改.可是按照网上的步骤,先用公钥进行签名,为了项目可运行.可调试,勾选了延迟签名的选项,并通过命令sn-Vrxxx.dll将xxx.dll加入到信任列表内,最后发布的时候,再用私钥对发布的dll进行再次签名.但我觉得这一系列步骤好像不是那么科学.还是我的方法有误?!过程如下:在开发机内,将程序进行私钥签名后发布到虚拟机内.在虚拟机(有VisualStudio环境)里试了一下,将已通过私钥签名的程序放到虚拟

C#中通过Assembly类访问程序集信息

C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法: 2.加载程序集:使用静态方法Assembly.Load(程序集名称)或Assembly.LoadFrom(程序集完整路径名): 3.属性: FullName:程序集显示名称: 3.方法: GetTypes():获取程序集中定义的类型. TestAssembly.cs: view plaincopy to clipboardprint? using System; using Sys

C# Assembly类访问程序集信息_php技巧

C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法: 2.加载程序集:使用静态方法Assembly.Load(程序集名称)或Assembly.LoadFrom(程序集完整路径名): 3.属性: FullName:程序集显示名称: 3.方法: GetTypes():获取程序集中定义的类型. TestAssembly.cs: view plaincopy to clipboardprint? using System; using Sys

强名称(2)引用强名称签名的程序集

引用强名称程序集的过程对我们来说都是透明的,无需做额外的工作.可以通过这种方式来检验强名称程序集的作用. 首先创建一个类库项目StrongNameReferenceLib,对其进行强名称签名. 图9-16引用强名称程序集 接下来修改之前创建的StrongName项目,让它引用StrongNameReferenceLib项目(如图9-16),调用其GetHello方法. StrongNameReferenceLib项目的主要代码如代码清单9-6所示. 代码清单9-6  StrongNameRefe

程序集的版本控制[下]

程序|控制 这里就具体的实现对程序集版本的控制简单地说说两种方法.希望能有一定的参考意义吧. 1.手动编码实现: 在类中添加静态只读的字符串类型的属性CodeVersion表示程序集(即变量所在类)的版本号.例如在2005年1月20日第一次编写了Member类,那么依照本文上半部分(http://blog.csdn.net/crazytomato/archive/2005/01/28/codelibraryversioncontrolshang.aspx)的讨论,该程序集编译后的版本号应为1.0