sn.exe试用

Strong Name工具

通过sn -k生成两个keyPair,然后新建一个dll和引用这个dll的exe程序,分别用keyPair1和keyPair2进行签名

csc /out:mydll.dll /target:library /platform:x86 /keyfile:keyPair1.snk mydll.cs

csc /out:dllcall.exe /target:exe /platform:x86 /reference:mydll.dll /keyfile:keyPair2.snk dllcall.cs

下面用sn -Tp检查两个assembly的public key和public key token:

>sn -Tp mydll.dll

Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.

Public key (hash algorithm: sha1):
0024000004800000940000000602000000240000525341310004000001000100d5010e1e7e7a4f
f4c7b80ba40c0625e45a2c0c5a1af491c16bc77865cbd88202511292c6ced85d81069bf894ed47
d38e6d93fec9ce984e930da573dde0ec57412f64c79a7f72ec869671c708cab90fe315aaefaa94
ca44aa0c4139e2707861f1ed2c15f7618ba59afe604d3fc8cb98fb54775c9de7b5b9bb5532f345
ee9a2ec5

Public key token is 20935a3ffe70c6a3

>sn -Tp dllcall.exe

Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.

Public key (hash algorithm: sha1):
00240000048000009400000006020000002400005253413100040000010001005130c9a77cc337
0e6cb290c13c9c914cc3c2c690320f6951be23ebe1009dbf869fe1dd3747ea3a9796168a55b337
fd084d3e82721004fbec6c18f5424af5fae6382034110ca0e839771b4e629c8b7f28ec4a67bd34
f8074a1ef0767db567c41a0964f4764915c196a8fee13ad62fce2da76aad71ad4deada9425ab47
1a7f04b8

Public key token is 4fb96655d126a5d0

貌似两个assembly可以拥有不同的签名,但是使用强名称的assembly不能应用未使用强名称的assembly,可是用csc生成文件的时候只提示了一个warn,而不是error:

warning CS8002: Referenced assembly 'mydll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have a strong name.

运行这个执行程序,则提示错误:

未经处理的异常: System.IO.FileLoadException: 未能加载文件或程序集“mydll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。需要强名称程序集。 (异常来自 HRESULT:0x80131044)
在 collect.Main()

很好,复现出了System.IO.FileLoadException错误。之前一直很奇怪,好端端的一个程序,为什么加密后提示类似的错误,看起来还真是强名称的问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注