C#数据PublicKeyToken值

时间:2013-02-10 12:11:08

标签: c#

如果我从项目 C#文件夹中打开 Resources.resx ,我看到的是这样的:

<data name="picture" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>..\Resources\picture.png;System.Drawing.Bitmap, System.Drawing, 
        Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

什么是 PublicKeyToken 以及我应该为其分配什么值?

3 个答案:

答案 0 :(得分:1)

.NET正在使用程序集;每个EXE或DLL文件都被视为程序集。

为了在任何其他需要它的.NET代码的机器上全局识别程序集(当然不在本地复制它),您可以将程序集放在全局程序集缓存中,即GAC。

您不能将任何程序集放在GAC中,出于安全考虑,在那里放置程序集需要强类型即签名。不会进入签署程序集的过程,因为它不相关,但签署过程的一部分是获得公钥。然后,您可以在任意数量的程序集上使用相同的密钥,因此程序集可能只有一个密钥,但许多不同的程序集可能共享一个密钥。

当.NET加载强类型程序集时,它必须得到三个参数:

  1. 大会名称。
  2. 装配版本。
  3. 组装公钥。
  4. 如果有任何缺失或错误,.NET将抛出无法找到程序集的错误。

    现在提出你的最后一个问题:给定一个已知的aseembly名称,如何找到它的公钥令牌?

    嗯,4.0之前的所有系统程序集都可以通过 Windows Button + R 找到,然后键入%windir%\assembly ENTER 。您将看到已安装组件的完整表,每个组件都有名称,版本和密钥。例如,您可以看到原始问题中发布的密钥确实属于System.Drawing程序集。

    由于4.0框架中的重大更改,其程序集的GAC位置已更改为%windir%\Microsoft.NET\assembly\,并且不再以友好列表方式显示,而是以文件夹和文件的形式显示:新GAC中的每个程序集都有它自己的文件夹,从名称中你可以提取公共令牌。例如,System.Web包含以下子文件夹:

      

    v4.0_4.0.0.0__b03f5f7f11d50a3a

    所以这意味着密钥是 b03f5f7f11d50a3a ,如果你引用了System.Web程序集,那么你应该放在.resx文件中。 (注意它与System.Drawing键相同,但它在这里并不相关)

答案 1 :(得分:0)

请参阅this

  

Microsoft通过使用哈希来解决“公钥膨胀”问题   强名称程序集的公钥。这些哈希被称为   公钥标记,是SHA1哈希的低8字节   强名称程序集的公钥。 SHA1哈希值为160位(20   字节)哈希,哈希的前12个字节被简单地丢弃   这个算法。

答案 2 :(得分:0)

如果您查看此参考的属性,您会注意到&#34;复制本地&#34;已被设置为&#34; True&#34;默认情况下。