将 .Net Core 2.0 项目引用 .Net Framework 4.5.2

4
我花了几个小时的时间尝试解决.Net Core 2.0无法加载.Net Framework 4.5.2 nuget包的问题。
现在我认为该寻求帮助了...
问题是:我有一个.Net Core 2.0 WebApi应用程序(A),我想重用我的.Net Framework 4.5.2库(B)。
我为B创建了nuget包,并在A中引用了nuget包。
这些库下载到了C:\Users\username.nuget\packages文件夹中,但是当我在代码中使用B时,它会出错并显示以下错误信息:
System.IO.FileLoadException:“无法加载文件或程序集 'xxx.TradeServices.Common, Version=2.1.289.1, Culture=neutral, PublicKeyToken=null'。找到的程序集清单定义与程序集引用不匹配。(HRESULT 异常:0x80131040)”
我随后添加了一些虚拟代码。
var client = new TradeServicesClient(EnvironmentType.Production);

xxx.TradeServices.Common已加载。

但是另一个异常出现了,指出无法加载依赖的dll。

FileNotFoundException: 无法加载文件或程序集'Ice, Version=3.7.0.0, Culture=neutral, PublicKeyToken=0c5ebb72d74932c6'。系统找不到指定的文件。

我已经检查了所有的依赖项,它们在C:\Users\username.nuget\packages文件夹中正确下载了。

我不确定为什么.Net Core会表现出这种方式。似乎依赖链没有被加载。请帮助我弄清楚发生了什么。


ASP.NET Core?还是.NET Core?尽管它们的名称不同,但它们有点不同。 - Marc Gravell
你所描述的基本上不被支持;你应该将 B 更改为多目标,即 B 应该针对 net452 netstandard2.0(或一些较早的 netstandard)。 - Marc Gravell
ASP.NET Core 2.0 - Larry
"asp.net core" 不知道它将在 .net core、.net framework 或其他什么上运行;最好使用针对 .net standard 的目标进行消耗。 - Marc Gravell
B的依赖关系怎么样?我无法将B的依赖关系更改为netstandard2.0... - Larry
显示剩余3条评论
2个回答

4

ASP.NET Core可以针对多个框架进行定位;例如,2.0 Web应用程序通常会在“netcoreapp2.0”(一个.NET Core应用程序)或“net461”(一个.NET应用程序)上运行,如csproj中的<TargetFramework>所指定的那样。正是这个<TargetFramework>决定了所有下游包解析的工作方式。如果它是“net461”,它可能会使用“net452”库。然而,“netcoreapp2.0”不想要“net452” - 而是更喜欢“netstandard2.0”或“netstandard1.6”等。定位.NET Standard将意味着所有下游包也需要定位.NET Standard,这并非总是可能。

所以:

  • 如果可能,请使您的依赖关系针对某个版本的.NET Standard
  • 如果不可能,请确保<TargetFramework>为“net461”或类似的版本

编辑:看起来默认项目也会在针对.NET时更改为Microsoft.AspNetCore,而在针对.NET Core时更改为Microsoft.AspNetCore.All - 因此,您可能还需要在csproj中更改<PackageReference ... />条目。如果您使用Microsoft.AspNetCore.All中没有的任何额外包 - 您可能需要手动添加您需要的那些。


现在它提示 Microsoft.Asp.NetCore.All 2.0.5 与 net461 不兼容。 - Larry
@Larry 把它改成 Microsoft.AspNetCore - 不要加 .All;如果其他部分缺失,你可能需要逐个添加组件。 - Marc Gravell

2

相关答案:https://stackoverflow.com/a/54116368/10891544

要从 .net core 项目中针对多个框架进行定位,打开您的 .csproj 文件并将 TargetFramework 标记替换为新的 TargetFrameworks 标记:

<TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>

这样就可以允许您从 .NET Core 项目中使用 .NET Framework 包。但是,您将失去跨平台运行代码的能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接