所以我有一个共享的Common库,它是参考RestSharp。我使用NuGet安装RestSharp,因此它是参考版本106.3.1。现在,我将“特定版本”设置为False,从csproj文件引用中删除了版本号,并将“私有”设置为true。
<Reference Include="RestSharp">
<HintPath>..\packages\RestSharp.106.3.1\lib\net452\RestSharp.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
然后从我的主.NET Framework 4.6.1 Web应用程序中引用此公共库。该Web应用程序反过来引用了NuGet的另一个库,该库对RestSharp 105.1.0.0具有硬版本依赖性。由于依赖于此,因此Web应用程序现在还引用了RestSharp 105.1.0.0。
现在,基于我对csproj汇编的理解,引用了应该的这项工作。没有。运行它时,在运行公共库中的代码(引用RestSharp 106.3.1的代码)时,我在运行时收到此错误:
System.IO.FileLoadException:'无法加载文件或程序集'RestSharp,Version = 106.3.1.0,Culture = neutral,PublicKeyToken = 598062e77f915f75'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040)'
总而言之,我引用的是与主项目不同的两个项目。这两个项目都依赖RestSharp,但版本不同。我以为上面的csproj更改应该可以解决此问题,但不起作用。
我需要更改什么才能解决此DLL地狱问题?非常感谢您的任何帮助。
更新:我按照建议尝试了绑定重定向,例如:
<dependentAssembly>
<assemblyIdentity name="RestSharp" publicKeyToken="598062e77f915f75" culture="en-us" />
<bindingRedirect oldVersion="105.1.0" newVersion="106.3.1.0" />
</dependentAssembly>
不幸的是,这没有用,因为RestSharp 105.1.0没有publicKeyToken,所以现在我收到一个错误消息,说找不到该库的105.1.0版本。还有其他想法吗?
更新2:试图删除公钥令牌和文化:
<dependentAssembly>
<assemblyIdentity name="RestSharp"/>
<bindingRedirect oldVersion="105.1.0.0" newVersion="106.3.1.0" />
</dependentAssembly>
这也不起作用,产生了:
FileLoadException:无法加载文件或程序集'RestSharp,版本= 105.1.0.0,区域性=中性,PublicKeyToken =空'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040)
答案 0 :(得分:1)
我有同样的问题。
关键是105.1.0的publicKeyToken为null,即使api与106.3.1.0也不同。因此它们不兼容,不能使用bingding重定向。
我建立了一个答案,但我尚未验证它,因为它不能承受任何麻烦。如果您不介意,可以尝试。
<dependentAssembly>
<assemblyIdentity name="RestSharp" publicKeyToken="null" culture="neutral" />
<codeBase version="105.1.0.0" href="RestSharp.105.1.0/RestSharp.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="RestSharp" publicKeyToken="598062e77f915f75" culture="neutral" />
<codeBase version="106.3.1.0" href="RestSharp.106.3.1/RestSharp.dll" />
</dependentAssembly>