如何给已经编译成dll的程序集flute.dll签名

28

我想签名dll的原因是我想将它添加到全局程序集缓存(Global Assembly Cache)中。这个程序集是一个用Java编写并移植到J#语言的CSS解析引擎。由于我使用的是VS2008,无法创建J#项目。而且,该程序集没有强名称密钥。现在已经构建完成,我不知道如何为它指定强名称密钥。

有人有什么想法吗?


1
我必须问一下,你为什么想要将它安装在全局程序集缓存(GAC)中?即使在同一服务器上的多个网站使用相同的程序集,我们已经养成了(或许值得质疑的)习惯,让每个站点/应用程序在其bin文件夹中保留自己的副本。这样确保了Web应用程序始终具有构建和预期版本,并且部署和回滚变得简单,因为没有超出Web文件夹层次结构的依赖项存在。 - 3Dave
无论我如何设置权限,我的网站部署项目每次编译时都会发出警告,说它没有权限移动dll文件。在TFS构建中也会出现相同的警告。我正在努力消除所有警告,包括FXCop。 - Stephen Lacy
5个回答

49

经过一番搜索,我找到了这篇文章,其中解释了一种实现方法。

摘录:

从VS.NET 命令提示符中输入以下命令:

  1. 生成 KeyFile: sn -k keyPair.snk
  2. 获得提供的程序集的 MSIL: ildasm providedAssembly.dll /out:providedAssembly.il
  3. 重命名/移动原始程序集: ren providedAssembly.dll providedAssembly.dll.orig
  4. 使用 MSIL 输出和程序集 KeyFile 创建新的程序集: ilasm providedAssembly.il /dll /key=keyPair.snk

我以前尝试过让它工作,但失败了,你能解释一下吗? - Stephen Lacy
5
链接已失效。这是一份通过谷歌找到的相同信息的备用来源: http://www.geekzilla.co.uk/ViewCE64BEF3-51A6-4F1C-90C9-6A76B015C9FB.htm - RenniePet
@PJ8 对我仍然不起作用...现在我收到以下运行时错误 强名称签名的程序集必须在其InternalsVisibleTo声明中指定公钥 - Simone

21

步骤1:拆卸组装件

ildasm myTest.dll /out:myTest.il 

第二步:使用您的强名称密钥重新组装

ilasm myTest.il /res:myTest.res /dll /key:myTest.snk /out:myTestSN.dll 

你可以使用以下命令进行验证:

sn -vf myTestSN.dll

希望这能有所帮助!


3

链接已损坏!备选方案:https://github.com/OJ/buffered.io-hugo/blob/master/content/post/2008-07-09-net-fu-signing-an-unsigned-assembly-without-delay-signing.markdown - Patrick

2

感谢PJ8在8年前发布的答案,它至今仍然帮助了我。我的程序集需要放入全局程序集缓存(GAC),但依赖于SQLite-pcl-net。从版本1.3.1开始,SQLite-pcl-net没有强名称,尽管现在依赖于强名称的SQLitePCLRaw.bundle_green。因此,换句话说,我必须签署SQLite-pcl-net以签署我的程序集。最终,我得到了一个由这篇文章和其他一些地方的信息整合而成的.bat文件。优点是:1.该.bat文件在您想要签署的程序集所在位置运行;2.提示开发机器上三个工具可能位于哪里;3.按顺序显示所有步骤。当然,缺点是您的PC上的ildasm、ilasm和sn实际位置可能有所不同。无论如何,干杯。

REM Create a new, random key pair
"c:\program files (x86)\microsoft sdks\windows\v8.1a\bin\NETFX 4.5.1 Tools\sn" -k SQLite-net.snk
REM Store the key in the container MySQLiteKeys in the strong name Cryptographic Services Provider (CSP).
"c:\program files (x86)\microsoft sdks\windows\v8.1a\bin\NETFX 4.5.1 Tools\sn" -i SQLite-net.snk MySQLiteKeys
REM Disassemble to Intermediate Language
"c:\program files (x86)\microsoft sdks\windows\v8.1a\bin\NETFX 4.5.1 Tools\ildasm" SQLite-net.dll /out:SQLite-net.il
REM Rename original file
ren SQLite-net.dll SQLite-net.dll.orig
REM Reassemble to a strong-named version
"c:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm" SQLite-net.il /dll /key=SQLite-net.snk /out:SQLite-net.dll 
REM Verify the assembly 
"c:\program files (x86)\microsoft sdks\windows\v8.1a\bin\NETFX 4.5.1 Tools\sn" -v SQLite-net.dll
REM Deletes MySQLiteKeys from the default CSP
"c:\program files (x86)\microsoft sdks\windows\v8.1a\bin\NETFX 4.5.1 Tools\sn" -d MySQLiteKeys
REM View results 
pause

非常感谢您的帮助。我尽力找到正确的演示格式,但我认为我错过了。 - IVSoftware

1

Strong Name工具可以使用-R选项重新签名现有程序集。但是,据我所知,程序集必须先前已经签名或延迟签名...不确定您是否可以将其用于未签名的程序集,但可以尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接