C#数据PublicKeyToken值

C#数据PublicKeyToken值,c#,C#,如果我从我的project 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=ne

如果我从我的project 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>

..\Resources\picture.png;System.Drawing.Bitmap,System.Drawing,
版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a
什么是PublicKeyToken?我应该为其分配什么值?

请参阅

Microsoft通过使用 强名称程序集的公钥。这些散列被称为 公钥令牌,和是 强名称程序集的公钥。SHA1哈希是160位(20 字节)散列,散列的前12个字节在 这个算法


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

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

您不能只在GAC中放置任何程序集,出于安全原因,将程序集放置在GAC中需要强类型签名。这里不涉及程序集的签名过程,因为这不相关,但签名过程的一部分是获取公钥。然后,您可以在任意数量的程序集上使用相同的键,这样程序集可能有一个键,但一个键可能由许多不同的程序集共享

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

  • 程序集名称
  • 程序集版本
  • 程序集公钥
  • 如果其中任何一个丢失或错误,.NET将抛出找不到程序集的错误

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

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

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

    v4.0_4.0.0.0_b03f5f7f11d50a3a


    因此,这意味着密钥是b03f5f7f11d50a3a,如果您引用了System.Web程序集,则应将其放置在
    .resx
    文件中。(注意,它与System.Drawing键相同,但在这里并不真正相关)

    如果您查看此引用的属性,您会注意到默认情况下“Copy Local”已设置为“True”。

    我很困惑。。。所以不能修改那个键?