zoukankan      html  css  js  c++  java
  • 如何生成强命名程序集

    如何生成强名称的程序集

    首先,使用SN.exe创建一个密钥文件:

    sn.exe -k MyKey.snk
    

    生成的文件包含了公钥和私钥的内容。我们可以查看公钥的内容,私钥是不允许查看的,所以要先将公钥提取出来。仍然是使用SN.exe:

    sn -p MyKey.snk MyPublicKey.snk
    
    sn -tp MyPublicKey.snk
    

    前一个命令将密钥文件中的公钥提取出来,放到 MyPublicKey.snk 文件中;后一个命令用于显示该文件中的公钥和公钥标记(Public key token),显示的内容可能如下(每个人生成的都不同):

    Microsoft (R) .NET Framework Strong Name Utility  Version 3.5.21022.8 
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Public key is 
    0024000004800000940000000602000000240000525341310004000001000100757c8b7854ffcb 
    4763250746c094e45db0c715214415fb01bd178f3374224c1292dbbc9dddfb6af7de1766888464 
    1a39fbea9d0bee001c093b228400aa39c0db5724fc11c221bd2c7442a30ef26c076b1bb0f559ce 
    7955572b4174125494a593c199d968019323483e72d5bdb93d96af14ccfeb0c5d4af6ea191d226 
    e6812db5
    
    Public key token is 337642649f453c2c
    
    公钥标记是公钥的64位散列值,用于简化对公钥的引用。
    

    第二步是创建强名称程序集。我们可以在源文件中使用AssemblyKeyFileAttribute,但在编译时会产生警告,建议使用命令行选项来代替此特性。所以此处使用csc.exe:

    csc /t:library /keyfile:MyKey.snk MyType.cs
    

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

    sn -Tp MyType.dll
    

    显示内容如下:

    Microsoft (R) .NET Framework Strong Name Utility  Version 3.5.21022.8 
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Public key is 
    0024000004800000940000000602000000240000525341310004000001000100757c8b7854ffcb 
    4763250746c094e45db0c715214415fb01bd178f3374224c1292dbbc9dddfb6af7de1766888464 
    1a39fbea9d0bee001c093b228400aa39c0db5724fc11c221bd2c7442a30ef26c076b1bb0f559ce 
    7955572b4174125494a593c199d968019323483e72d5bdb93d96af14ccfeb0c5d4af6ea191d226 
    e6812db5
    
    Public key token is 337642649f453c2c
    

    由此可见,公钥的内容确实嵌入到了程序集当中。除此之外,程序集的全部内容经过散列编码后,还使用密钥进行了签名,也嵌入到了程序集中。

    这样我们就得到了一个强名称程序集。如果有程序引用了该程序集,会记录由以下内容标识的程序集:

    MyType, Version=1.0.3087.28686, Culture=neutral, PublicKeyToken=337642649f453c2c
    

    这些内容唯一的标识了一个强名称程序集,由于公钥太长,这里只引用了公钥标记。当程序运行时,CLR 会根据这些内容去搜寻程序集,只有完全匹配的程序集才会被加载,即便是版本的细微差别都不会忽略。如果没有找到,或者找到的程序集不匹配,都会产生异常。

    Resource Reference

  • 相关阅读:
    错误日志记录
    解决连接Oracle 11g报ORA-01034和ORA-27101的错误
    windows和linux 下将tomcat注册为服务
    ORA-12170: TNS:Connect timeout occurred
    ubuntu修改时区和时间的方法
    SecureCRT中文显示乱码的解决方法
    修復 “Failed to bring up eth0″ in Ubuntu virtualbox
    HDU 1358 Period
    rcp(插件开发)点击按钮出现 The chosen operation is not enabled 解决办法
    CRM上线之路 走上了CRM实施顾问-第12天上班 -第三周
  • 原文地址:https://www.cnblogs.com/naliang/p/5546682.html
Copyright © 2011-2022 走看看