4

如果我从我的项目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,我应该为它分配什么值?

4

3 回答 3

3

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

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

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

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

  1. 程序集名称。
  2. 汇编版本。
  3. 程序集公钥。

如果其中任何一个缺失或错误,.NET 将抛出找不到程序集的错误。

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

好吧,所有 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.resx如果您引用 System.Web 程序集,这就是您应该在文件中放置的内容。(注意它与 System.Drawing 键相同,但在这里并不真正相关)

于 2013-02-10T14:19:49.063 回答
0

看到这个

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

于 2013-02-10T12:12:13.443 回答
0

如果您查看此参考的属性,您会注意到默认情况下“复制本地”已设置为“真”。

于 2016-01-14T21:25:32.600 回答