Agile .NET中文网站 > 新手入门 > Agile .NET强名称签名怎么保留 Agile .NET保护后程序集签名失效如何修复
教程中心分类
Agile .NET强名称签名怎么保留 Agile .NET保护后程序集签名失效如何修复
发布时间:2026/07/31 17:09:07

  程序集原本带有强名称,经过Agile.NET混淆、加密或合并后,却出现“强名称验证失败”,这种情况并不少见。保护过程会改写程序集内容,原签名自然无法继续对应新的文件。

 

  处理“Agile.NET强名称签名怎么保留Agile.NET保护后程序集签名失效如何修复”,要把重新签名放进保护流程。原来的私钥文件也得保留好,临时换一把新密钥,程序集身份会跟着变化。

  一、Agile.NET强名称签名怎么保留

 

  Agile.NET支持在保护完成后重新签名。项目本身已经使用强名称时,应选择最初编译时使用的同一份密钥文件,软件会在修改程序集后重新生成签名。

 

  1、确认原程序集签名状态

 

  ①打开Visual Studio开发者命令提示符。

 

  ②验证原程序集:

 

  sn-vf MyApp.dll

 

  ③查看原公钥标记:

 

  sn-T MyApp.dll

 

  ④记录输出结果。

 

  sn-vf会强制验证强名称签名,sn-T用于显示程序集的公钥标记。后面保护完成后再查一次,很快就能看出签名有没有保住。

 

  2、在Agile.NET项目中选择原密钥

 

  ①打开Agile.NET,新建或载入保护项目。

 

  ②添加需要保护的EXE和DLL。

 

  ③设置独立的输出目录。

 

  ④找到强名称密钥或签名文件设置。

 

  ⑤选择原项目使用的.snk密钥。

 

  ⑥执行保护并生成新程序集。

 

  这里一定要用原密钥。随便新建一个.snk虽然也能签名,但公钥标记会变,其他程序集仍按旧身份引用它,运行时就可能加载失败。

 

  Agile.NET还建议把软件包含的程序集一起加入项目,即使部分DLL不做混淆,也可以由工具复制到统一输出目录。这样不容易把保护后的主程序和旧版依赖混在一起。

 

  3、命令行构建时启用重新签名

 

  自动化构建可以使用Agile.NET命令行参数:

 

  /Resign:

 

  该参数用于使用指定签名文件,重新签署强名称或延迟签名的程序集。

 

  流水线里的顺序可以固定为:

 

  ①编译Release程序集。

 

  ②将文件复制到临时保护目录。

 

  ③执行Agile.NET保护。

 

  ④使用原密钥重新签名。

 

  ⑤验证签名后再发布。

 

  别直接在编译输出目录里覆盖原DLL。保护失败时,原始文件也被替换了,想对比都找不到。

 

  4、保护完成后重新验证

 

  ①对输出程序集执行:

 

  sn-vf SecuredMyApp.dll

 

  ②再查看公钥标记:

 

  sn-T SecuredMyApp.dll

 

  ③与原程序集的公钥标记对比。

 

  ④启动程序并测试依赖加载。

 

  验证成功、公钥标记也一致,说明程序集仍保持原来的强名称身份。光看文件能启动还不够,有些签名问题要到特定DLL被加载时才会暴露。

 

  二、Agile.NET保护后程序集签名失效如何修复

 

  签名失效后,先看保护项目有没有配置密钥,再看后面是否还有工具修改过程序集。签完名以后又改文件,签名照样会失效。

 

  1、保护时没有提供密钥

 

  最直接的处理方式,是重新打开Agile.NET项目,加入原始密钥后再生成一次。

 

  ①删除本次错误输出。

 

  ②使用未保护的原始程序集重新开始。

 

  ③配置原.snk密钥。

 

  ④再次执行保护。

 

  ⑤用sn-vf验证结果。

 

  不建议拿已经保护过的文件反复套保护。处理层数多了以后,运行异常会更难判断,还是从干净的Release文件重做更稳。

  2、保护后又被其他工具修改

 

  资源写入、程序集补丁、安装包处理和其他后处理工具,都可能再次改动程序集。Microsoft也说明,强名称程序集经过后处理后,原签名可能失效,需要重新签名;另一种做法是先延迟签名,所有处理完成后再补齐完整签名。

 

  构建顺序可以调整为:

 

  ①完成混淆、合并和资源修改。

 

  ②确认文件不会再被改写。

 

  ③执行最终强名称签名。

 

  ④再做签名验证。

 

  ⑤最后打包发布。

 

  简单说,强名称签名尽量放在最后一次程序集改写之后。后面又动了DLL,就得再签一次。

 

  3、程序集采用了延迟签名

 

  延迟签名的程序集只写入公钥,并预留签名空间,最终还要使用包含私钥的密钥对完成签名。Microsoft的Sn.exe支持使用-R重新签署已签名或延迟签名的程序集。

 

  可以执行:

 

  sn-R SecuredMyApp.dll OriginalKey.snk

 

  随后再验证:

 

  sn-vf SecuredMyApp.dll

 

  开发环境为了调试跳过验证,只能算临时处理。到了正式发布阶段,仍要完成完整签名,别把“本机能跑”当成修好了。

 

  4、原来的私钥文件已经丢失

 

  只有公钥文件时,无法重新生成与原程序集相同的完整签名。强名称签名需要公钥和私钥组成的密钥对。

 

  这种情况通常只能找回原密钥备份,或者更换新密钥并重新构建所有相关程序集。

 

  换新密钥后,公钥标记也会变化。引用旧程序集身份的项目、插件和配置都要跟着更新,工作量可能不小,所以密钥文件真不能随手丢。

 

  5、合并程序集后签名丢失

 

  使用Agile.NET合并多个程序集时,第一项程序集会作为主程序集。主程序集带有强名称,并且项目提供了签名文件时,合并后的目标程序集会使用该密钥重新签名。

 

  合并后出错,可以检查:

 

  1、主程序集是否选对。

 

  2、签名文件是否已经配置。

 

  3、依赖DLL是否仍引用旧程序集。

 

  4、输出目录中是否混入旧文件。

 

  别一边用合并后的单文件,一边又把旧DLL全部复制到发布目录。运行时加载到哪一份,很容易说不清。

 

  三、怎样让程序集保护和签名流程更稳定

 

  签名问题反复出现,多半是构建步骤没有固定下来。人工保护一次、手工复制一次,少一个文件或选错一个密钥都很正常。

 

  1、把保护和签名写入构建流程

 

  建议固定“编译、保护、重新签名、验证、打包”的顺序。任意一步失败,就停止发布,不要继续生成安装包。

 

  原始程序集、保护后程序集和最终发布文件也要分目录保存。文件名一样没关系,目录必须分清。

 

  2、统一检查所有程序集

 

  主程序签名正常,某个依赖DLL签名失败,程序仍可能在启动或调用功能时出错。

 

  可以对发布目录中的EXE和DLL逐个执行强名称验证。数量多时写成脚本,一次性跑完,比人工点开检查靠谱。

 

  3、不要混淆强名称和代码签名

 

  Microsoft明确说明,强名称主要提供程序集唯一身份,不应被当成安全信任机制。它和使用证书完成的代码签名不是一回事。

 

  项目同时使用强名称和数字证书时,一般先完成程序集保护与强名称签名,再进行最终代码签名。这样后面的保护步骤不会把已经生成的文件签名再次破坏。

  总结

 

  “Agile.NET强名称签名怎么保留Agile.NET保护后程序集签名失效如何修复”关系到程序集身份、依赖加载和发布流程是否稳定。原密钥妥善保存,保护与签名顺序固定,再配合发布前验证,能减少很多运行阶段才暴露的问题。希望本文对大家处理Agile.NET程序集签名问题有所帮助。

135 2431 0251