【问题标题】:Resolving .NET assembly reference to a different name?将 .NET 程序集引用解析为不同的名称?
【发布时间】:2011-05-14 20:07:58
【问题描述】:
我的项目引用了 Library1.dll 和 Library2.dll。 Library2.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:我把这个更新放在这里,因为它对 cmets 来说有点长:)
好主意,谢谢。我得到了重定向,但它抱怨因为名称不同,这是日志:
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.dll 和 bin/Newtonsoft.Json.12/Newtonsoft.Json.dll,具体取决于版本(分别为 6-10 或 11-12)。即使目录路径不同,NAME 也成功匹配 文件名。
注意“bin”本身就是替代版本的 href 的一部分;根据与探测路径不同的应用基础进行相关调整。在关于在 IIS 下运行的情况下,应用程序库位于 bin 目录之上。 (请参阅 Fusion 日志中的“LOG:Appbase = ..”。)
不幸的是,无论任何配置文件如何,MSBuild 过程都不会自动遵循引用程序集的目录结构。将项目设置为不“复制本地”替代程序集版本,然后将它们复制为辅助过程的一部分,以确保保持正确的结构。如果任何已编译的程序集将备用版本作为直接引用,则最好确保默认情况下没有“复制本地”。