如果我从项目 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 以及我应该为其分配什么值?
答案 0 :(得分:1)
.NET正在使用程序集;每个EXE或DLL文件都被视为程序集。
为了在任何其他需要它的.NET代码的机器上全局识别程序集(当然不在本地复制它),您可以将程序集放在全局程序集缓存中,即GAC。
您不能将任何程序集放在GAC中,出于安全考虑,在那里放置程序集需要强类型即签名。不会进入签署程序集的过程,因为它不相关,但签署过程的一部分是获得公钥。然后,您可以在任意数量的程序集上使用相同的密钥,因此程序集可能只有一个密钥,但许多不同的程序集可能共享一个密钥。
当.NET加载强类型程序集时,它必须得到三个参数:
如果有任何缺失或错误,.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;默认情况下。