应该兼容的不兼容的.NET Standard程序集?

时间:2018-06-09 06:30:00

标签: c# .net .net-assembly .net-standard-2.0 assembly-binding-redirect

我有一个.NET Standard 2.0 DLL项目。

Project target framework

除了NETStandard.Library 2.0.1之外,它没有其他参考资料,一切都很好。

WPF应用程序引用它,一切似乎都正常。

System.Collections.Immutable 1.5.0的nuget包添加到DLL项目后,解决方案资源管理器的Dependencies根目录上会出现一个黄色感叹号。 (嗯......我现在看到感叹号仍然存在,即使我删除了这个包,但我想这是一个VS错误,因为在添加此库之前一切似乎都运行正常)

exclamation without explanation...

拥有这两个包,一切都很好,但是当我尝试使用ImmutableDictionary时,我得到了这个:

  

System.IO.FileNotFoundException:'无法加载文件或程序集'System.Collections.Immutable,Version = 1.2.3.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。'

看看nuget包,我知道这两个应该一起工作,因为(根据我的理解)'System.Collections.Immutable`库说它支持.NET标准2.0。

packages

我是.NET标准世界的新手。

查看我主应用程序System.Collections.Immutable.dll文件夹中bin的公钥标记,我发现它确实b03f5f7f11d50a3a正如预期的那样。但版本不同。

Hm...

通常,在旧的.NET中,我会尝试在应用程序的配置文件中添加程序集重定向。但这样做似乎并没有任何区别。将其添加到我的引用DLL的WPF应用程序中:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

...将异常更改为:

  

System.IO.FileNotFoundException:'无法加载文件或程序集'System.Collections.Immutable,Version = 4.0.11.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。'

     

内部异常

     

FileNotFoundException:无法加载文件或程序集'System.Collections.Immutable,Version = 1.2.3.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。

这里发生了什么? 我不能一起使用这两个nuget包吗?

更新

我现在注意到我获得的DLL版本来自System.Collections.Concurrent.dll,而我对System.Collections.Immutable.dll感兴趣,这在我的bin文件夹中找不到... 我甚至没有找到nuget包存储在我的解决方案中的位置。

更新2:

事实证明,当我创建一个具有类似设置的新解决方案(引用.NET Standard 2 DLL的完整框架控制台应用程序)时,我会得到完全相同的行为。

按照@LasseVågsætherKarlsen的建议,我从这里https://www.nuget.org/packages/System.Collections.Immutable下载了nuget包,从中提取了正确的DLL,并将其放在我的bin文件夹中。然后控制台应用程序工作。

我使用的是Visual Studio的15.7.1版本。我不确定在最新的15.7.2版本中修复了哪些更改...

您可以通过从此处下载来尝试我的可验证示例: https://mega.nz/#!YZMwGABD!eHHxvNdO59l2m5ZlHMG1vvqCd-GHv3EVckR-9htDojs

2 个答案:

答案 0 :(得分:2)

有两种方法可以解决这个问题:

1 - 更新ConsoleApp1的项目文件,以将其包含在属性组

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

2 - 直接在ConsoleApp1中添加对System.Collections.Immutable的引用 项目

这是一个已知问题,使用Project-to-Project引用和NuGet包引用不会自动正确地引用引用。正在跟踪here,但其中一个解决方法应该取消阻止。

答案 1 :(得分:1)

对于我来说,事实证明同一解决方案中的项目具有不同版本的System.Collections.Immutable.dll。 (1.4.0和1.5.0)

某种程度上,MSBuild不会注意到dll有2个版本,并试图在某些项目中查找并加载dll版本1.5.0而不是1.4.0。

要解决此问题,只需更新并确保每个项目。同一sln中的文件具有相同版本的dll。

我也遇到了Syste.Net.Http的问题。