如果我从项目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>
Run Code Online (Sandbox Code Playgroud)
什么是PublicKeyToken?我应该为其分配什么值?
.NET 正在使用程序集;每个 EXE 或 DLL 文件都被视为一个程序集。
为了使程序集在计算机上被任何其他需要它的 .NET 代码全局识别(当然无需在本地复制),您可以将程序集放置在全局程序集缓存(又名 GAC)中。
您不能在 GAC 中放置任意程序集,出于安全原因,将程序集放置在那里需要对其进行强类型化(也称为签名)。不会进入对程序集进行签名的过程,因为它不相关,但签名过程的一部分是获取公钥。然后,您可以在任意数量的程序集上使用同一密钥,因此程序集可能有一个密钥,但一个密钥可能由许多不同的程序集共享。
当 .NET 加载强类型程序集时,它必须获取三个参数:
如果其中任何一个缺失或错误,.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 键相同,但在这里并不真正相关)
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |