【问题标题】:Resolving .NET assembly reference to a different name?将 .NET 程序集引用解析为不同的名称?
【发布时间】:2011-05-14 20:07:58
【问题描述】:

我的项目引用了 Library1.dllLibrary2.dllLibrary2.dll 依赖于 Library1.dll,但它被编译为使用不同的名称 Library1.Net40.dll 引用它。

有没有一种好方法告诉我的应用程序重定向所有对 Library1.Net40.dll 的引用以解析为 Library1.dll?也许类似于使用 重定向版本的方式?

我有一个处理 AppDomain.AssemblyResolve 事件的解决方案,但它有点小技巧,我希望有更好的方法来做到这一点。

编辑: 供任何人参考,这是我最终使用AppDomain.AssemblyResolve event 重定向到不同程序集的解决方法。

【问题讨论】:

    标签: c# .net asp.net clr-hosting


    【解决方案1】:

    你试过玩<codeBase> element吗?

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <dependentAssembly>
                <assemblyIdentity name="Library1.Net40"
                                  publicKeyToken="..."
                                  culture="neutral" />
                <codeBase version="2.0.0.0"
                          href="Library1.dll"/>
             </dependentAssembly>
          </assemblyBinding>
       </runtime>
    </configuration>
    

    (未经测试;不知道它是否有效。)

    CF:我把这个更新放在这里,因为它对 cme​​ts 来说有点长:)

    好主意,谢谢。我得到了重定向,但它抱怨因为名称不同,这是日志:

    LOG:正在尝试下载新的 URL 文件:///C:/Project/bin/Library1.dll。
    LOG:程序集下载成功。尝试设置文件:C:\Project\bin\Library1.dll
    LOG:进入下载缓存设置阶段。
    日志:程序集名称为:Library1,版本=3.5.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed
    警告:比较程序集名称导致不匹配:NAME
    ERR:程序集引用与找到的程序集定义不匹配。
    ERR:设置失败,hr = 0x80131040。
    ERR:无法完成程序集的设置(hr = 0x80131040)。探测终止。

    【讨论】:

      【解决方案2】:

      当应用 PARTIAL 解析时,ASSEMBLY NAME 必须与文件名匹配。但是文件的位置可以不同。

      否则 Fusion Binding Log 会报告“WRN: Comparing the assembly name results in the mismatch: NAME”并且无法绑定。

      (好消息:可以重命名程序集 DLL 以匹配程序集名称。)

      例如:

        <dependentAssembly>
          <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
          <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="6.0.0.0" />
          <bindingRedirect oldVersion="11.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
          <codeBase version="12.0.0.0" href="bin/Newtonsoft.Json.12/Newtonsoft.Json.dll" />
        </dependentAssembly>
      

      这将解析 bin/Newtonsoft.Json.dllbin/Newtonsoft.Json.12/Newtonsoft.Json.dll,具体取决于版本(分别为 6-10 或 11-12)。即使目录路径不同,NAME 也成功匹配 文件名

      注意“bin”本身就是替代版本的 href 的一部分;根据与探测路径不同的应用基础进行相关调整。在关于在 IIS 下运行的情况下,应用程序库位于 bin 目录之上。 (请参阅 Fusion 日志中的“LOG:Appbase = ..”。)

      不幸的是,无论任何配置文件如何,MSBuild 过程都不会自动遵循引用程序集的目录结构。将项目设置为“复制本地”替代程序集版本,然后将它们复制为辅助过程的一部分,以确保保持正确的结构。如果任何已编译的程序集将备用版本作为直接引用,则最好确保默认情况下没有“复制本地”。

      【讨论】:

        猜你喜欢
        • 2013-09-09
        • 2010-11-27
        • 1970-01-01
        • 2012-04-23
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 2015-03-20
        相关资源
        最近更新 更多