我想签名dll的原因是我想将它添加到全局程序集缓存(Global Assembly Cache)中。这个程序集是一个用Java编写并移植到J#语言的CSS解析引擎。由于我使用的是VS2008,无法创建J#项目。而且,该程序集没有强名称密钥。现在已经构建完成,我不知道如何为它指定强名称密钥。
有人有什么想法吗?
我想签名dll的原因是我想将它添加到全局程序集缓存(Global Assembly Cache)中。这个程序集是一个用Java编写并移植到J#语言的CSS解析引擎。由于我使用的是VS2008,无法创建J#项目。而且,该程序集没有强名称密钥。现在已经构建完成,我不知道如何为它指定强名称密钥。
有人有什么想法吗?
经过一番搜索,我找到了这篇文章,其中解释了一种实现方法。
摘录:
从VS.NET 命令提示符中输入以下命令:
强名称签名的程序集必须在其InternalsVisibleTo声明中指定公钥
。 - Simone步骤1:拆卸组装件
ildasm myTest.dll /out:myTest.il
第二步:使用您的强名称密钥重新组装
ilasm myTest.il /res:myTest.res /dll /key:myTest.snk /out:myTestSN.dll
你可以使用以下命令进行验证:
sn -vf myTestSN.dll
希望这能有所帮助!
http://buffered.io/posts/net-fu-signing-an-unsigned-assembly-without-delay-signing
编辑:抱歉,链接已失效。
感谢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
Strong Name工具可以使用-R选项重新签名现有程序集。但是,据我所知,程序集必须先前已经签名或延迟签名...不确定您是否可以将其用于未签名的程序集,但可以尝试一下。