在 .Net Framework 应用程序中从 .Net Core 库调用方法

Invoke method from .Net Core library in .Net framework application

使用 VisualStudio 2019。

有 3 个程序集:

以下也是正确的:

我正在尝试创建 .net core 3.1 程序集的实例,然后从 Framework 4.7.2 应用程序调用该实例的方法。 Framework 应用程序知道要调用哪些接口方法。

实例创建工作正常,但是,当我尝试调用该实例的方法时 - 抛出以下异常:

{"Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.":"System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}

按照此线程中提到的建议 我已将对 NETStandard.Library v2.0.3 的 Nuget 引用添加到主 .Net Framework 应用程序,但它没有解决问题。

是否可以在 .net 框架应用程序域中使用 .net 核心库进行操作?我做错了什么?

最终,问题可以追溯到这里:

.Net Core 3.1 - library that implements common interface library

这是一个特定于平台的库,实现了通用接口库;你只能从netcoreapp3.1(或更高版本)使用它。

如果您想从 .NET Framework 代码库中使用该库,该库应该执行以下操作之一:

  1. 目标 netstandard2.0 - 如果您在实现中不需要任何特定于框架的东西
  2. 多目标 netcoreapp3.1 和 netstandard2.0 - 如果您想在可用时使用 netcoreapp3.1 功能,否则使用下层通用实现
  3. 多目标 netcoreapp3.1 和 net472 - 如果实现完全是特定于平台的并且不可能有通用实现

多目标就像更改 csproj 一样简单:

<TargetFramework>netcoreapp3.1</TargetFramework>

<TargetFrameworks>netcoreapp3.1;netstandard2.0</TargetFrameworks>

您会自动获得一个 NETCOREAPP3_1NETSTANDARD2_0 构建符号,您可以使用 #if 进行测试,或者您可以通过条件在 csproj 中做出其他决定,例如:

<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0' OR '$(TargetFramework)'=='netcoreapp3.0'">
    <PackageReference Include="System.Data.SqlClient" Version="4.6.1" />
</ItemGroup>