VS引用不同版本Dll报错
一、准备
- 新建类库项目,V1DLL,引用旧版本的dll
- 新建类库项目,V2DLL,引用新版本的dll
二、使用:新建使用项目
- 在使用项目引用V1的dll,然后再Debug中放入旧版本的Newtonsoft.Json.dll(该项目中没有引用任何版本的Newtonsoft.Json.dll)
- 结果:可以正常使用,不会报版本异常错误
- 在使用项目引用V1的dll,然后再Debug中放入新版本的Newtonsoft.Json.dll(该项目中没有引用任何版本的Newtonsoft.Json.dll),有时可能在 使用项目中需要用到新的dll
- 结果:会报错,提示找不到旧版本的dll
- 原因是V1 的dll调用的是旧版本的dll,而放在Debug里的是新版本。
解决办法一:
- 通过修改App.config文件对Newtonsoft.Json.dll重新定向,若遇到版本低于新版本的话,这定向到新版本:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
- 注意:
- 以上oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"标识从0版到第13版都用第13版
- 此方法新旧的dll需要相同的的publicKeyToken可以通过添加dll到项目中,然后转到定义获取publicKeyToken
- 优缺点:这种办法运行程序没有报错,但是要拷贝一个新的版本到运行目录下
解决办法二:引用不用的dll多个版本共存
- 在Debug文件夹下放两个版本的dll,然后配置App.config文件,使得不同版本的dll去不同的文件夹下获得调用
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<codeBase version="13.0.0.0" href="新\Newtonsoft.Json.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<codeBase version="4.0.3.0" href="旧\Newtonsoft.Json.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
解决办法三:
不修改App.config文件,引用最新的dll
三种办法对比:
方法一与方法三是只能把一个新版本的dll放在Debug路径下,方法二可以多个版本共存。
三、额外注意
1、方法二与方法三是需要修改App.config,修改这里时,编译后编译器会自动帮我们修改到****.exe.config文件中,所以假如在软件升级时,单单替换Degug里的exe是不行的。需要把****.exe.config也要做相应的修改/替换。
2、引用dll到项目时,版本信息会记录在项目中,假如临时替换掉Debug下的dll,这里的版本信息不回更新。有时也会造成版本报错。所以建议类库生成时,删除引用的dll重新添加引用。