10

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

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

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

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

4

2 回答 2

5

你试过玩<codeBase> 元素吗?

<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:我把这个更新放在这里,因为评论有点长:)

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

日志:正在尝试下载新的 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)。探测终止。
于 2010-11-24T01:25:57.987 回答
0

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

否则 Fusion Binding Log 将报告“WRN:比较程序集名称导致不匹配: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 日志中的“日志:Appbase = ..”。)

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

于 2020-01-04T02:41:57.240 回答