强程序集名称 & GAC 介绍

(一)使用强名称程序集好处:

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:

  • 强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。

  • 强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。

  • 强名称提供可靠的完整性检查。通过 .NET Framework 安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。

  • 强名称程序集可以保证唯一性。公/私密钥对是由发行者自行生成的,是唯一的,保证了程序集的标识不会重复。
  • 强名称程序集可以防篡改。强类型程序集使用私钥对自己进行了签名,这样在被加载时可以检查程序集是否被修改。
  • 强名称程序集可以实施版本策略。对于弱名称程序集,引用它的程序不会关心它的版本,而对于强类型的程序集来说,引用它的程序会被绑定到特定版本的程序集上,如果使用新版本的强名称程序集替换旧版本,会导致程序无法运行。(当然还可以使用配置文件对强名称程序集进行重定向)。
  • 强名称程序集可以部署到GAC中。GAC指全局程序集缓存,这是一个公共目录,放在此处的程序集可以被本机任意一个程序所引用。弱名称程序集无法部署到此处。不同版本的相同程序集还可以同时存在于GAC中。
  • 强名称程序集只能引用强名称程序集。弱名称程序集可以引用强名称程序集,也可以引用弱名称程序集,但强名称程序集只能引用强名称程序集。
  • 强名称程序集支持并行执行。并行(side-by-side)执行是指程序同时引用了多个版本的同名程序集,这样在运行时,会有多个版本的同名程序集被加载和同时执行。通常不建议使用。

在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

 
使用强名称的步骤:
1、创建密匙文件(.snk文件),打开vs command,输入:sn.exe -k 密匙文件名称.snk
2、将密匙文件加入到工程中csc /t:library /keyfile:MyKey.snk MyType.cs
3、创建强名称程序集。两种方式:
    1、我们可以在源文件中使用AssemblyKeyFileAttribute,    [assembly: AssemblyKeyFileAttribute("MyKey.snk")]
    namespace PowerNameAssembly
    {
        /// <summary>
        /// 强名称程序集
        /// </summary>
        public class TestClass
        {
            public void TestMethod()
            {
                //TODO::
            }
        }
    }
    2、使用csc.exe, 建议使用命令行选项来代替此特性。所以此处使用csc.exe:
        csc /t:library /keyfile:密匙文件名称.snk 要进行签名的文件.cs

    运行后得到 MyType.dll ,我们可以显示其中包含的公钥标记,看是否和上面的相

    sn -Tp MyType.dll

4、编译之后,公匙的内容你嵌入到了程序集,程序集内容经过散列编码后,再使用密匙签名,也嵌入到了程序集中

note:
1、如果要查看密匙文件中的公匙内容(私匙不允许查看),输入:sn -tp 密匙文件名称.snk
2、提取公匙内容: sn -p 公匙文件名称.snk 密匙文件名称.snk
 
 
 
 
 
 
 
(二)GAC的使用,
    GAC:全局程序集缓存,具有GAC的服务器必须安装公共语言运行库,GAC负责存储指定给计算机中应用程序共享的程序集,仅仅是在需要使用共享程序集时才会放置到GAC中。
   
    将Assembly放置到GAC中四种方式:
    1、使用Command,比较适合开发阶段使用:gacutil.exe /i Assembly名称.dll
    2、使用Windows installer去发布到GAC中,比较适合部署阶段使用。
    3、使用NET Framework 配置工具 (Mscorcfg.msc)。具体介绍:http://msdn.microsoft.com/zh-cn/library/2bc0cxhc.aspx
    4、使用 Windows 软件开发工具包 (SDK) 提供的名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展,使用该外壳扩展可将程序集拖放到全局程序集缓存中,
 
    GAC将assembly存放在:系统盘符:\Windows\system\ 中,从中可以看出.net framework其实也使用了GAC,里面内含了很多.net的dll,就是那些我们可以直接使用但是不用
    using 的assembly,例如:System.Net
posted @ 2010-02-27 17:18  msp  阅读(718)  评论(0编辑  收藏  举报