VS2012编译类库报错:非强名称程序集引用强名称程序集不允许
错误原因分析
.NET编译阶段强制要求:非强签名程序集(即错误信息中
PublicKeyToken=null的程序集)不允许引用强签名程序集。
- 你添加的
bypassTrustedAppStrongNames配置仅作用于程序运行时的强名校验,对编译阶段的校验逻辑完全无效,因此无法解决该问题。 - 子项目单独编译无报错是因为单独编译时不会触发全依赖链的强签名一致性校验,只有编译主项目时MSBuild会扫描全依赖链路的签名规则,才会批量抛出错误。
解决方案
以下方案均兼容VS2012版本,可根据你的实际场景选择:
方案1:给所有自有项目添加强签名(最推荐)
该方案完全符合.NET编译规则,不会产生后续兼容问题,操作步骤如下:
- 右键项目 → 选择「属性」→ 切换到「签名」标签页
- 勾选「为程序集签名」选项
- 下拉框选择
<新建...>,自定义密钥文件名,可按需设置密码(也可留空不设置密码) - 所有错误信息中提示
PublicKeyToken=null的项目(主项目、My project1、My project2等)都按上述步骤配置完成后,重新编译整个解决方案即可。
方案2:将引用的外部强签名dll改为非强签名版本
如果你的项目不允许配置强签名,可修改外部依赖的签名属性,操作步骤:
- 打开VS2012开发人员命令提示符,执行
ildasm命令导出强签名dll的IL代码:ildasm /all /out=外部库名.il 外部原强签名库名.dll - 打开导出的
.il文件,删除文件中所有.publickey相关的行 - 执行
ilasm命令重新编译为非强签名dll:ilasm /dll /output=外部库名_无签名.dll 外部库名.il - 所有项目中替换引用为新生成的无签名版本外部dll,重新编译即可。
方案3:添加编译阶段强签名跳过配置
如果是同一外部库同时存在签名/无签名版本导致的冲突,可直接修改主项目配置跳过编译校验:
- 右键主项目 → 选择「卸载项目」,再右键选择「编辑 <主项目名>.csproj」
- 在文件中第一个
<PropertyGroup>节点内添加如下配置:
<SkipStrongNameVerification>true</SkipStrongNameVerification> <StrongNameVerificationSkipList>$(StrongNameVerificationSkipList);<报错的外部库的PublicKeyToken值></StrongNameVerificationSkipList>
- 保存文件后重新加载项目,重新编译即可。
内容的提问来源于stack exchange,提问作者Max Markson
相关产品推荐
相关产品推荐

