好问题阿杰 👍,这个在 .NET 程序集开发与部署中很关键。我来帮你梳理一下 PublicKeyToken 与强命名(Strong Name) 的概念、作用以及常见问题。
一、什么是强命名 (Strong Name)
在 .NET 里,强命名程序集(Strong-Named Assembly)就是带有 唯一身份标识 的程序集。
它由以下几个部分组成:
- 程序集名称 (Assembly Name)
- 版本号 (Version)
- 区域性(Culture)
- 公钥 (Public Key)
- 签名 (Signature)
👉 这些信息共同决定一个程序集的“唯一身份”,防止 DLL 冲突(俗称“DLL Hell”)。
二、PublicKey 与 PublicKeyToken
- Public Key (公钥)
- 强命名时用到 一对密钥(公钥 + 私钥)。
- 私钥用来签名程序集,公钥放在程序集里,用于验证签名。
- 公钥是很长的一串字节。
- PublicKeyToken(公钥标记)
- 公钥的哈希值的后 8 字节(通常用十六进制表示)。
- 是 公钥的简短标识符,便于在配置文件(如
app.config
或web.config
)里引用程序集。
👉 举个例子:
<dependentAssembly>
<assemblyIdentity
name="System.Data"
publicKeyToken="b77a5c561934e089"
culture="neutral"
version="4.0.0.0" />
</dependentAssembly>
这里的 b77a5c561934e089
就是 PublicKeyToken。
三、强命名的作用
- 唯一性:
不同开发者即使取了相同程序集名,强命名也能区分。 - 安全性:
确保程序集未被篡改(签名校验失败则无法加载)。 - GAC(全局程序集缓存):
只有强命名程序集才能放进 GAC,全局共享使用。
四、如何生成强命名程序集
- 生成密钥对
使用sn.exe
(Strong Name Tool):sn -k mykey.snk
- 在项目中引用密钥文件
在AssemblyInfo.cs
中:[assembly: AssemblyKeyFile("mykey.snk")]
- 编译时签名
Visual Studio → 项目属性 → “签名” → 勾选“为程序集签名”。
五、如何查看 PublicKeyToken
- 命令行
sn -T YourAssembly.dll
会输出程序集的 PublicKeyToken。 - ILDasm 工具
打开程序集 →Manifest
→ 可看到公钥和 Token。 - PowerShell
[System.Reflection.AssemblyName]::GetAssemblyName("YourAssembly.dll").GetPublicKeyToken()
六、常见问题
- 为什么有时找不到程序集?
- 配置文件里的 PublicKeyToken 写错。
- 程序集版本号不同(强命名绑定严格)。
- 能否去掉强命名?
- 可以(比如测试阶段),但正式发布最好保留。
- 不同版本程序集如何兼容?
- 在
app.config
中配置 bindingRedirect:<dependentAssembly> <assemblyIdentity name="YourAssembly" publicKeyToken="abcdef1234567890" culture="neutral" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly>
- 在
✅ 一句话总结:
- PublicKeyToken 是公钥的缩略标识,方便引用。
- 强命名 保证程序集唯一、安全,可放入 GAC。
发表回复