从 .Net Core 2.0 项目中参考 .Net framework 4.5.2

reference .Net framework 4.5.2 from .Net Core 2.0 project

我花了几个小时试图弄清楚为什么 .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: 'Could not load file or assembly 'xxx.TradeServices.Common, Version=2.1.289.1, Culture=neutral, PublicKeyToken=null'. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)'

然后我添加了一些伪代码

var client = new TradeServicesClient(EnvironmentType.Production);

xxx.TradeServices.Common 已加载。

但出现另一个异常 说无法加载依赖dll。

FileNotFoundException: Could not load file or assembly 'Ice, Version=3.7.0.0, Culture=neutral, PublicKeyToken=0c5ebb72d74932c6'. The system cannot find the file specified.

我已经检查了所有依赖项,它们已正确下载到

C:\Users\username.nuget\packages

文件夹

我不确定为什么 .Net Core 会这样。似乎没有加载依赖链。你能帮我弄清楚这是怎么回事吗?

asp.net 核心可以针对多个框架;例如,一个 2.0 网络应用程序通常会在 "netcoreapp2.0"(.NET Core 应用程序)或 "net461"(.NET 应用程序)上 运行,如 <TargetFramework>在 csproj 中。正是这个 <TargetFramework> 决定了所有下游包解析的工作方式。如果是"net461",拿一个"net452"库可能会很开心。但是,"netcoreapp2.0" 不需要 "net452" - 而是更喜欢 "netstandard2.0" 或 "netstandard1.6" 等。针对 .NET Standard 将意味着所有下游包 also 需要以 .NET Standard 为目标,这并不总是可行的。

所以:

  • 如果可能,使您的依赖项以某个版本的 .NET Standard 为目标
  • 如果不可能,请确保 <TargetFramework> 是 "net461" 或类似的

编辑:看起来默认项目 Microsoft.AspNetCore(针对 .NET 时)和 Microsoft.AspNetCore.All(针对 .NET Core 时)之间变化- 因此您可能还需要更改 csproj 中的 <PackageReference ... /> 条目。如果您正在使用 Microsoft.AspNetCore.All 中没有的任何额外包 Microsoft.AspNetCore - 您可能需要手动添加您需要的包。

相关回答:

要从 .net 核心项目中定位多个框架,请打开您的 .csproj 文件并将 TargetFramework 标签替换为新的 TargetFrameworks 标签:

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

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