精华内容
下载资源
问答
  • 当你的项目中多个不同的项目以及不同的依赖存在不同的依赖程序集时,可能会因为依赖不同版本的程序集而产生冲突。而绑定重定向可以帮助解决不同程序集的依赖版本不同的问题,使整个程序使用统一个版本的 dll 来...

    当你的项目中多个不同的项目以及不同的依赖存在不同的依赖程序集时,可能会因为依赖于不同版本的程序集而产生冲突。而绑定重定向可以帮助解决不同程序集的依赖版本不同的问题,使整个程序使用统一个版本的 dll 来运行整个应用程序。

    然而,如果我们就是需要使用一个分离的不同版本,那么我们就需要禁用掉自动生成绑定重定向。本文介绍如何禁用自动生成绑定重定向。


    本文的结论只有一句,就是在项目中设置属性 <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>。阅读本文全文是了解更多与绑定重定向此场景相关的知识。

    绑定重定向

    从 .NET Framework 4.5.1 开始到后面的 .NET Core 所有版本,编译器会自动向你的程序集中插入绑定重定向。如果你升级使用了新的 csproj 格式,即便你用了旧的 .NET Framework 也会自动生成绑定重定向。

    关于新旧 csproj 格式,你可以参考我的另一篇博客:将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj - walterlv

    你可以在你的应用程序的 App.config 文件中查看到自动生成的绑定重定向。当然,编译之后这个 App.config 文件会编程 “你的程序集名称.config” 文件,例如对于我的 Walterlv.Demo.exe 程序对应 Walterlv.Demo.exe.config 文件。

    一个典型的包含绑定重定向的文件大概是下面这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
        </startup>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
                    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
                </dependentAssembly>
                <dependentAssembly>
                    <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
                    <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
                </dependentAssembly>
            </assemblyBinding>
        </runtime>
    </configuration>
    

    上面 dependentAssembly 以及 bindingRedirect 就是在描述绑定重定向。

    对于上面的代码,指的是:

    1. 如果依赖中发现了任何 0.0.0.0-11.0.0.0 区间版本号的 Newtonsoft.Json 程序集的引用,都将使用 11.0.0.0 版本的。
    2. 如果以来中发现了任何 0.0.0.0-4.0.3.0 区间版本号的 System.ValueTuple 程序集的引用,都将使用 4.0.3.0 版本的(这个其实使用的 NuGet 包版本是 4.5)。

    引用同名但不同版本的 dll

    绑定重定向多数时候都是在帮助我们解决依赖问题,然而我们总有一些时候不是按照常规的方式来使用依赖,例如下文这样的方式:

    以上文章的场景,是需要在同一个解决方案的不同项目中引用不同版本的同名 dll。解决方法是像下面这样:

    <dependentAssembly>
        <assemblyIdentity name="LiteDB" publicKeyToken="4ee40123013c9f27" culture="neutral" />
        <codeBase version="2.0.2.0" href="LiteDB.2.0.2.0\LiteDB.dll" />
        <codeBase version="4.0.0.0" href="LiteDB.4.0.0.0\LiteDB.dll" />
    </dependentAssembly>
    

    于是,如果引用了 2.0.2.0 版本的 LiteDB 的时候,会去应用程序所在目录的 LiteDB.2.0.2.0 子目录中查找名为 LiteDB.dll 的引用 dll;而如果引用了 4.0.0.0 版本的 LiteDB 的时候,会去应用程序所在目录的 LiteDB.4.0.0.0 子目录中查找名为 LiteDB.dll 的引用 dll。这种方式使用两个 dll 互不干扰。

    禁用绑定重定向

    如果你的项目从 .NET Framework 4.5 或者更早版本升级到 .NET Framework 4.5.1 或者 .NET Core 的版本,或者 csproj 的格式升级到了新的基于 Microsoft.NET.Sdk 的版本,那么绑定重定向就会从之前的手动编程自动生成。

    但是如果你编写了上一节中我们讲到的你需要引用同名程序集的多个版本的时候,如果依然自动生成绑定重定向,那么上面的功能会失效。

    解决方法,便是禁用自动生成绑定重定向。在你的主项目中添加一个属性:

    <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
    

    参考资料


    我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

    如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • 引用不同版本dll

    千次阅读 2017-06-09 13:35:35
    一个项目引用不同版本的同一dll,会引发以下报错: 未能加载文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件 这里来解决项目中同一...

    问题描述

    一个项目引用不同版本的同一dll,会引发以下报错:

    未能加载文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件 

    这里来解决项目中同一dll的多版本问题。

    解决方式

    通过配置web.config配置文件(app.config或web.config)增加配置节点

    不同场景有不同的解决方式,下面说明

    1. 场景一   以高版本兼容

    例如:新旧项目都引用Newtonsoft.Json,但是不同版本。需要以最高版本兼容。 

     

    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
          <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
      </assemblyBinding>
    </runtime>

     

    2. 场景二   同一dll两种版本共存

     

    例如:项目自己引用log4net.dll 版本1.2.13.0 。添加第三方某个dll,第三方依赖log4net.dll版本1.2.9.0,项目中需要两种版本共存。
    这里还分两种情况,dll的publicKeyToken相同还是不同 (publicKeyToken查询见说明1)
    publicKeyToken相同,配置方法:
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
          <codeBase version="1.2.13.0" href="bin\log4netdll\1_2_13\log4net.dll" />
          <codeBase version="1.2.9.0" href="bin\log4netdll\1_2_9\log4net.dll" />
        </dependentAssembly>
      </assemblyBinding>
    </runtime>

    publicKeyToken不同,配置方法:
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
          <codeBase version="1.2.13.0" href="bin\log4netdll\1_2_13\log4net.dll" />
        </dependentAssembly>
        <dependentAssembly>
          <assemblyIdentity name="log4net" publicKeyToken="b32731d11ce58905" />
          <codeBase version="1.2.9.0" href="bin\log4netdll\1_2_9\log4net.dll" />
        </dependentAssembly>
      </assemblyBinding>
    </runtime>
     

    说明

    1.publicKeyToken获取方式:使用vs的Tools Command Prompt命令行工具,输入:SN -T "path",例如:

     

    C:\Program Files (x86)\Microsoft Visual Studio 11.0>SN -T "D:\project\liberary\External\log4net.dll"
    
    Microsoft(R) .NET Framework 强名称实用工具 版本 4.0.30319.17929
    版权所有(C) Microsoft Corporation。保留所有权利。
    
    公钥标记为 b32731d11ce58905
     

     

     

    参考文献

    msdn对配置详解:  点击打开链接

     

     

    展开全文
  • C# 引用不同版本dll

    千次阅读 2018-11-29 22:19:46
    同一个解决方案或有依赖关系的两个项目引用同名但不同版本DLL 需要额外补充的是: href 应当使用相对路径 这里的相对路径,是指程序输出目录($(OutDir))的相对路径。 &lt;dependentAssembly&gt;...

    同一解决方案中,不同工程可能需要引用同一DLL的不同版本(非必须,不推荐);以下是解决方案。

    基本可以参看这里:
    引用不同版本dll

    备用链接:
    引用不同版本dll
    同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL

    需要额外补充的是:

    href 应当使用相对路径

    这里的相对路径,是指程序输出目录($(OutDir))的相对路径。

    <dependentAssembly>
        <assemblyIdentity name="LiteDB" publicKeyToken="4ee40123013c9f27" culture="neutral" />
        <codeBase version="2.0.2.0" href="LiteDB.2.0.2.0\LiteDB.dll" />
        <codeBase version="4.0.0.0" href="LiteDB.4.0.0.0\LiteDB.dll" />
    </dependentAssembly>
    

    dll文件的 git 管理

    一般输出目录下的内容为自动生成,位于bin目录下,是不会纳入git管理的,所以,需要在程序目录中用一个文件夹管理dll文件,并纳入git仓库。
    再在启动程序的预先生成事件中,利用xcopy指令将dll文件拷贝到输出目录对于位置。如:

    xcopy /E /Y $(SolutionDir)_Externals\Refs\LiteDB.2.0.2.0\*.dll $(OutDir)LiteDB.2.0.2.0\  
    xcopy /E /Y $(SolutionDir)_Externals\Refs\LiteDB.4.0.0.0\*.dll $(OutDir)LiteDB.4.0.0.0\  
    

    这样,不仅可以将 dll 文件纳入git管理,团队中其它成员拉取你提交的代码后,也不会出现缺少dll不能运行的情况(因为使用了xcopy将dll拷贝到输出目录)。

    关闭DLL引用的 复制到本地

    为了避免某些诡异的问题,建议关闭DLL引用的 复制到本地 属性。

    如何避免升级?

    通常,之所以会使用两个版本的 DLL ,是因为兼容性问题,需要读取旧有数据等。则旧版本的引用不能被升级,如何做?

    阻止某个 NuGet 包意外升级 - walterlv


    END

    展开全文
  • 一个项目引用不同版本dll

    万次阅读 2017-06-13 10:27:28
    一个项目引用不同版本的同一dll,会引发以下报错: 未能加载文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件  这里来解决项目中...

    问题描述

    一个项目引用不同版本的同一dll,会引发以下报错:

    未能加载文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件 

    这里来解决项目中同一dll的多版本问题。

    解决方式

    通过配置web.config配置文件(app.config或web.config)增加配置节点

    不同场景有不同的解决方式,下面说明

    1. 场景一   以高版本兼容

    例如:新旧项目都引用Newtonsoft.Json,但是不同版本。需要以最高版本兼容。 

    [html]  view plain  copy
    1. <runtime>  
    2.   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
    3.     <dependentAssembly>  
    4.       <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>  
    5.       <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>  
    6.     </dependentAssembly>  
    7.   </assemblyBinding>  
    8. </runtime>  

    2. 场景二   同一dll两种版本共存

    例如:项目自己引用log4net.dll 版本1.2.13.0 。添加第三方某个dll,第三方依赖log4net.dll版本1.2.9.0,项目中需要两种版本共存。
    这里还分两种情况,dll的publicKeyToken相同还是不同 (publicKeyToken查询见说明1)
    publicKeyToken相同,配置方法:
    [html]  view plain  copy
    1. <runtime>  
    2.   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
    3.     <dependentAssembly>  
    4.       <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />  
    5.       <codeBase version="1.2.13.0" href="bin\log4netdll\1_2_13\log4net.dll" />  
    6.       <codeBase version="1.2.9.0" href="bin\log4netdll\1_2_9\log4net.dll" />  
    7.     </dependentAssembly>  
    8.   </assemblyBinding>  
    9. </runtime>  

    publicKeyToken不同,配置方法:
    [html]  view plain  copy
    1. <runtime>  
    2.   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
    3.     <dependentAssembly>  
    4.       <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />  
    5.       <codeBase version="1.2.13.0" href="bin\log4netdll\1_2_13\log4net.dll" />  
    6.     </dependentAssembly>  
    7.     <dependentAssembly>  
    8.       <assemblyIdentity name="log4net" publicKeyToken="b32731d11ce58905" />  
    9.       <codeBase version="1.2.9.0" href="bin\log4netdll\1_2_9\log4net.dll" />  
    10.     </dependentAssembly>  
    11.   </assemblyBinding>  
    12. </runtime>  

    说明

    1.publicKeyToken获取方式:使用vs的Tools Command Prompt命令行工具,输入:SN -T "path",例如:

    C:\Program Files (x86)\Microsoft Visual Studio 11.0>SN -T "D:\project\liberary\External\log4net.dll"  
      
    Microsoft(R) .NET Framework 强名称实用工具 版本 4.0.30319.17929  
    版权所有(C) Microsoft Corporation。保留所有权利。  
      
    公钥标记为 b32731d11ce58905 

    注意:href的路径要保证正确。

    参考文献

    msdn对配置详解:  点击打开链接

    参考文章

    http://blog.csdn.net/dang13579/article/details/72956684

    展开全文
  • depend walker dll依赖查询工具 dll输出函数查询工具 测试可用
  • 好多开发者在做windows开发的时候,容易遇到dll依赖的问题,VS自带一个小工具dumpbin, 这个工具挺好用,可以查看dll相关依赖库,还可以看dll导出接口。 下面演示下查依赖库用法: 运行 dumpbin /dependents nm.exe ...
  • 查看程序或dll依赖dll

    千次阅读 2017-01-02 16:53:17
    在使用一些dll封装到软件分发后,可能会遇到因为缺少依赖dll而导致软件崩溃或无法启动的问题,免费软件Dependency Walker(depends.exe)是解决这个问题的神器。Depends可以扫描程序或dll依赖dll,从而可以...
  • 加载含有依赖其他dll库的dll

    千次阅读 2018-02-03 18:42:26
    当编写的dll依赖其他dll库时,exe在加载这个dll时,exe会去找这个dll依赖的其他dll,而查找目录只是其exe所在的目录或指定的那几个系统目录。不会在你放置的dll目录中找。 例如: A.dll依赖B.dll,把A.dll和B....
  • ole查看dll依赖

    2011-09-09 11:58:16
    ole查看dll依赖ole查看dll依赖
  • dll依赖查看器

    2014-11-20 22:34:45
    查找dll依赖dll,调用dll文件报错找不到依赖dll,可以使用此工具分析
  • DLL依赖查看工具

    2018-11-10 13:11:21
    DLL依赖查看工具。
  • 从VC6中提取出来的,用来分析dll依赖关系的神器。查看dll接口等都非常实用。 windows下C++开发人员必备工具。
  • 使用VS自带的工具dumpbin,具体位置在VS安装目录的 VC\bin 文件夹下dumpbin....举例,我要查看ivusdenoise.dll这个文件依赖哪些其他dll文件 只需输入: dumpbin /dependents "C:\Users\ad\Documents\ivusdn_dlltest\...
  • 近期在做项目的时候,由于各个子系统开发的问题,造成了其中的一个系统使用了NPOI高版本,另一个则使用的低版本,最操蛋的是,高版本并不兼容低版本,面对客户不想升级的dll的情况,硬着头皮找解决办法。网上很多都...
  • 有的时候需要查看日志,比较麻烦,这里推荐一个工具,可以查看exe或者dll缺少的依赖 depends下载地址 http://www.dependencywalker.com/ 按需下载,然后运行软件 打开缺少dll的exe或者dll 然后看提示 ...
  • DEPENDS—DLL测试依赖

    2018-04-26 17:08:42
    DEPENDS—DLL测试依赖,查找dll的内容,方便查询是否缺少dll
  • 查看dll依赖软件

    2019-01-03 09:58:45
    查询dll依赖工具
  • windows下Qt5.4程序依赖的常用dll,包括MySQL插件、platform、网络等. release版本。 把生成的exe放入文件夹里就能运行
  • 版本VS链接到msvcrt.lib上一篇中介绍的方法适用面并不广,毕竟C++有着一大堆的优良特性和类库,比如STL、boost、MFC和QT等等,在普通的开发中只...下面我们就尝试使用高版本的VC++生成可以链接到msvcrt.dll的程序。
  • dll依赖查看工具

    2013-05-13 16:19:32
    dll依赖查看工具,能很方便的查看某个dll文件对其他dll文件的依赖
  • exe依赖dll提取软件

    2018-01-22 10:32:02
    exe 依赖 dll 提取,Qt打包神器, 可执行程序依赖dll自动提取
  • DLL依赖查找工具

    2017-11-05 23:15:50
    DLL依赖查找工具,解决Java load JNI时Can't find dependent libraries问题。
  • 在一个解决方案中,如果外部DLL打包的第三方DLL与项目中引用的DLL版本冲突,从而导致不能运行时。解决方案1: 先在项目中添加所需要的DLL,然后右键点属性,再查看该DLL版本信息2: 作类似的修改,将新版本号...
  • DLL依赖查看工具支持32位与64位WINDOWS系统,这个工具对程序员而言就是神器,例如,你可以使用它来检查是缺少哪些DLL文件而导致的程序运行失败,例如你已添加了DLL文件到SYSTEM32下了,程序运行时,会显示黄色的图标...
  • 真实有效,DLL依赖查看工具。查看DLL程序中相互依赖DLL
  • dll依赖项查看工具,DLL DEPENDS

    热门讨论 2009-07-20 14:00:45
    快速检查dll依赖项,让我们快速发现dll中缺少的关联文件。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,072
精华内容 41,628
关键字:

依赖不同版本的dll