今天跟大家聊聊这个 `publickeytoken` 的事儿。平时捣鼓代码,有时候还真就绕不开它,特别是在配置某些东西或者引用特定版本的库时,总得用到这串字符。我这儿就把自己怎么搞定它的过程给大家捋一遍。
记得有一次,我需要在一个配置文件里指定一个程序集的完整名称,里面就要求必须带上这个 `publickeytoken`。当时我对着那个 `.dll` 文件,有点懵,这玩意儿藏在哪儿?
摸索工具
我先是琢磨着,这肯定是微软自家开发工具链里的东西。打开我的 Visual Studio,翻了翻菜单,没直接找到。后来想起来,VS 装完之后,好像会带一些专门的命令行工具。我就去开始菜单里找,果然,在 Visual Studio 的文件夹下面,找到了一个叫 “Developer Command Prompt for VS” (或者类似名字,不同版本可能叫法有点差异)的东西。
直觉告诉我,就是它了!
动手查找
打开这个黑乎乎的命令行窗口后,我就开始回忆以前好像用过的一个命令,叫 `sn`,好像是 Strong Name 的缩写。我试着敲了 `sn /?` 看了下帮助,果然有戏。
里面有个参数 `-T` 或者 `-Tp` 看起来就是用来显示公钥令牌(PublicKeyToken)的。于是我就试着敲命令了:
sn -T "你的dll文件完整路径"
特别注意: 这里的 `"你的dll文件完整路径"` 必须换成你那个 `.dll` 文件实实在在放在电脑里的位置,比如 `C:\MyProject\bin\Debug\*` 这种。路径如果带空格,最好用双引号给它包起来,免得出错。
敲完回车,等了一下,命令行就输出了一堆信息,其中一行清楚地写着:
Public key token is xxxxxxxxxxxxxxxx
那串十六进制的字符 `xxxxxxxxxxxxxxxx` 就是我要找的 `publickeytoken` 了。当时就觉得,搞定了!
要是没找到?
不过有时候运气不输完命令,它可能会提示说这个程序集没有强名称(strong name)。这就意味着这个 `.dll` 文件在编译的时候,没有给它签名,自然也就没有 `publickeytoken`。
遇到这种情况咋办?如果这个库是你自己写的,或者你有源代码,那就好办了。
自己动手,丰衣足食:给程序集签名
我就得给它加上签名。过程也不复杂:
- 第一步:生成密钥文件。还是在那个开发者命令行窗口里,用 `sn` 命令生成一个密钥文件(`.snk` 文件)。命令大概是这样:
sn -k "C:\MyProject\*"
这会在 `C:\MyProject\` 目录下生成一个叫 `*` 的文件。路径和文件名你自己定就行。 - 第二步:项目里设置签名。打开 Visual Studio,找到你的那个类库项目。右键点击项目,选“属性”。在属性页里找到“签名”(Signing)这一项。
- 第三步:勾选并指定密钥。把“为程序集签名”(Sign the assembly)这个复选框勾上。然后在下面的下拉框里选择“浏览...”,找到你刚才用 `sn -k` 命令生成的那个 `.snk` 文件(比如 `C:\MyProject\*`),选中它。
- 第四步:重新编译。设置好了之后,保存项目属性,然后重新生成(Rebuild)整个项目。
这样编译出来的 `.dll` 文件,就带上了强名称签名。
再次验证
为了确保万无一失,我通常会再回到那个开发者命令行窗口,用同样的 `sn -T` 命令再检查一遍刚刚重新生成的 `.dll` 文件。
sn -T "C:\MyProject\bin\Debug\*"
这回它就应该能顺利显示出 `publickeytoken` 了。
基本上,这就是我获取或者给程序集加上 `publickeytoken` 的一套流程。看起来步骤不少,但实际操作起来,只要找到那个开发者命令行工具和记住 `sn` 这个命令,就挺顺手的。希望能帮到有需要的朋友们。