VS2019下.NET Standard与.NET Framework项目ServiceStack程序集绑定冲突求助
解决ServiceStack程序集绑定冲突的步骤
这是典型的跨.NET平台(.NET Standard + .NET Framework)使用ServiceStack时遇到的程序集绑定冲突问题,我来一步步帮你解决:
1. 先彻底清理并重新生成解决方案
首先要排除编译缓存带来的问题:
- 手动删除Foo和Bar项目下所有的
bin和obj文件夹 - 在VS中依次执行「清理解决方案」→「重新生成解决方案」
- 检查Bar项目输出目录,确认只有带公钥令牌
02c12cbda47e6587的5.0.0.0版本ServiceStack.Interfaces.dll存在
2. 修正绑定重定向配置(核心步骤)
你的错误提示是找不到无公钥令牌的5.0.0.0版本ServiceStack.Interfaces,但实际部署的是带公钥的版本。因此需要在Bar的app.config中同时处理无公钥和有公钥的引用请求:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 处理无公钥的ServiceStack.Interfaces引用 --> <dependentAssembly> <assemblyIdentity name="ServiceStack.Interfaces" publicKeyToken="null" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.0.0.0" /> </dependentAssembly> <!-- 处理有公钥的ServiceStack.Interfaces引用 --> <dependentAssembly> <assemblyIdentity name="ServiceStack.Interfaces" publicKeyToken="02c12cbda47e6587" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.0.0.0" /> </dependentAssembly> <!-- 别忘了添加其他ServiceStack核心dll的重定向,比如ServiceStack.dll --> <dependentAssembly> <assemblyIdentity name="ServiceStack" publicKeyToken="02c12cbda47e6587" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
这里的关键是覆盖无公钥版本的重定向,把所有对无公钥ServiceStack.Interfaces的请求,都指向你实际存在的带公钥版本。
3. 验证项目引用和NuGet包一致性
- 确认Foo和Bar的ServiceStack NuGet包版本都是5.5.0,没有手动添加的本地dll引用(检查项目引用列表,ServiceStack相关项应该显示为「NuGet: ServiceStack 5.5.0」)
- 可以用dnSpy或ildasm工具查看Foo.dll的依赖,确认它引用的ServiceStack.Interfaces是带公钥的5.0.0.0版本,而非无公钥版本
4. 检查Windows服务安装目录
如果你用InstallUtil安装服务:
- 确保安装目录下的所有ServiceStack相关dll,都是直接从Bar项目输出目录复制过来的,没有混入旧版本或无公钥的dll
- 用命令
sn -T ServiceStack.Interfaces.dll验证公钥令牌是否为02c12cbda47e6587
5. 启用自动绑定重定向(可选辅助)
在Bar项目的属性→「应用程序」选项卡中,勾选「自动生成绑定重定向」,然后重新生成项目。VS会自动检测依赖冲突并生成最优的重定向配置,可能会帮你自动补上无公钥版本的重定向规则。
为什么会出现这个问题?
ServiceStack 5.x版本中,.NET Standard和.NET Framework的程序集文件版本统一显示为5.0.0.0(对应NuGet包版本5.5.0)。你的.NET Standard类库Foo在编译时,可能默认引用了无公钥的ServiceStack.Interfaces版本,导致.NET Framework主机Bar在运行时尝试查找无公钥的dll,而实际部署的是带公钥的版本,最终触发绑定冲突。
内容的提问来源于stack exchange,提问作者user1713059
相关产品推荐
相关产品推荐

