我有一个项目,即library.exe
。在这里我引用了一个程序集(logging.dll
ver 1.0.3.0),我给这个程序集一个强名。
现在假设我更改了logging.dll
中的方法并制作了版本1.0.4.0。
现在当我用这个新DLL复制/替换旧DLL时,我得到了一个例外。
我知道异常是因为我已经更改了DLL的版本号。因为它是强名称DLL,所以除非我重建library.exe
,否则不允许这样做。
我想用上面的故事说的是
我对第1点和第2点是否正确?
何时不应使用强名称程序集?
“强名命集会”的缺点是什么?
答案 0 :(得分:8)
只有在将程序集放在GAC中时才真正需要它,但它也有助于防止篡改。更改程序集中的代码非常容易,因此这给坏人带来了好处。当您使用强名称程序集时,您只能使用私钥对其进行签名。人们仍然可以改变你的程序集,但他们不能给它相同的强名,因为他们没有你的私钥。在那种情况下.Net拒绝组装篡改。当他们使用新的私钥对您的程序集进行签名时,.Net仍然拒绝加载它,因为程序集的标识已经更改。
有几种方法可以解决版本控制问题。当您的应用程序想要加载v1程序集时,您可以告诉它无论如何都要查看v2。有关详细信息,请参阅here。另一种选择是根本不更改程序集版本,而是仅更改程序集的文件版本。对于.Net,程序集是相同的,但您和您的安装程序仍然可以看到哪个更新。请参阅AssemblyFileVersion属性。
答案 1 :(得分:3)
两者都正确。
如果您之后签署了程序集,则不需要StrongName,就像使用真实证书一样。
在我看来,强有力的命名并不值得,例如this link。那么你需要将它组装到GAC中,但就是这样。