我使用“sn -k MyStrongkey.snk”创建了一个强密钥,其中包含一个公钥和一个私钥。我使用“sn -p MyStrongKey.snk MyStrongPublicKey.snk”从中提取了公钥。
现在,当我将此提取的公钥分配给 classLibrary 并运行应用程序时,它会抛出一个错误 -强名称验证失败。
是否无法在应用程序范围之外为程序集创建和分配密钥?
感谢您的任何指导
您不能使用公钥对程序集进行完全签名。这就是您收到此错误的原因。
MyStrongKey.snk
您必须使用您的密钥对(包含私钥)对您的程序集进行签名。
延迟标志
对程序集进行部分签名(使用您的公钥)的唯一方法是通过延迟签名。但是为了使用部分签名的程序集,您必须配置您的机器以跳过签名验证。
以下示例将 .NET Framework 配置为ClassLibrary
在您的开发计算机上为您的程序集跳过强名称签名验证:
sn -Vr ClassLibrary.dll
您还可以使用 sn.exe 工具跳过使用特定密钥签名的所有程序集的签名验证。例如,如果您想将您的机器配置为跳过使用与您的相同密钥签名的所有程序集延迟ClassLibrary
,您首先在您的开发机器上执行以下操作:
sn -T ClassLibrary.dll
这将打印出公钥令牌的值,这是公钥的缩短版本,如下所示:
Microsoft (R) .NET Framework Strong Name Utility Version 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved. Public key
token is b03f5f7f11d50a3a
(请注意,公钥令牌的实际值将根据您的公钥而有所不同。)然后执行以下命令以跳过使用该公钥令牌的任何程序集的强名称验证:
sn -Vr *,b03f5f7f11d50a3a
更多信息:http: //msdn.microsoft.com/en-us/magazine/cc163583.aspx
公钥和私钥
公钥的目标是在不暴露整个签名的情况下公开表示您的强名称签名。
不知何故,您可以将公钥视为读取器密钥,将私钥视为写入器密钥。
Visual Studio 提供了一种密码保护密钥对的方法,以避免未经授权的签名和公钥提取。但是密码存储在您的计算机上。请参阅强名称密钥密码存储在哪里?