VS引用不同版本Dll报错

一、准备

  1. 新建类库项目,V1DLL,引用旧版本的dll

  2. 新建类库项目,V2DLL,引用新版本的dll

二、使用:新建使用项目

  1. 在使用项目引用V1的dll,然后再Debug中放入版本的Newtonsoft.Json.dll(该项目中没有引用任何版本的Newtonsoft.Json.dll)
    1. 结果:可以正常使用,不会报版本异常错误

  2. 在使用项目引用V1的dll,然后再Debug中放入版本的Newtonsoft.Json.dll(该项目中没有引用任何版本的Newtonsoft.Json.dll),有时可能在 使用项目中需要用到新的dll
    1. 结果:会报错,提示找不到旧版本的dll

    2. 原因是V1 的dll调用的是旧版本的dll,而放在Debug里的是新版本。

       

解决办法一:

  1. 通过修改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>

  1. 注意:
    1. 以上oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"标识从0版到第13版都用第13版
    2. 此方法新旧的dll需要相同的的publicKeyToken可以通过添加dll到项目中,然后转到定义获取publicKeyToken
  2. 优缺点:这种办法运行程序没有报错,但是要拷贝一个新的版本到运行目录下

解决办法二:引用不用的dll多个版本共存

  1. 在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重新添加引用。

posted @ 2022-05-09 08:45  ihh2021  阅读(602)  评论(0编辑  收藏  举报