在 .Net Framework 应用程序中从 .Net Core 库调用方法
Invoke method from .Net Core library in .Net framework application
使用 VisualStudio 2019。
有 3 个程序集:
.Net Framework 4.7.2
- 主应用程序
.Net Standard 2.0
- 常用接口库
.Net Core 3.1
- 实现通用接口库的库
以下也是正确的:
.Net Framework 4.7.2.
通过 Nuget
引用 .Net Standard 2.0
公共库
.Net Core 3.1.
通过 Nuget
引用 .Net Standard 2.0
公共库(并实现它)
我正在尝试创建 .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 代码库中使用该库,该库应该执行以下操作之一:
- 目标 netstandard2.0 - 如果您在实现中不需要任何特定于框架的东西
- 多目标 netcoreapp3.1 和 netstandard2.0 - 如果您想在可用时使用 netcoreapp3.1 功能,否则使用下层通用实现
- 多目标 netcoreapp3.1 和 net472 - 如果实现完全是特定于平台的并且不可能有通用实现
多目标就像更改 csproj 一样简单:
<TargetFramework>netcoreapp3.1</TargetFramework>
到
<TargetFrameworks>netcoreapp3.1;netstandard2.0</TargetFrameworks>
您会自动获得一个 NETCOREAPP3_1
或 NETSTANDARD2_0
构建符号,您可以使用 #if
进行测试,或者您可以通过条件在 csproj 中做出其他决定,例如:
<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0' OR '$(TargetFramework)'=='netcoreapp3.0'">
<PackageReference Include="System.Data.SqlClient" Version="4.6.1" />
</ItemGroup>
使用 VisualStudio 2019。
有 3 个程序集:
.Net Framework 4.7.2
- 主应用程序.Net Standard 2.0
- 常用接口库.Net Core 3.1
- 实现通用接口库的库
以下也是正确的:
.Net Framework 4.7.2.
通过Nuget
引用 .Net Core 3.1.
通过Nuget
引用.Net Standard 2.0
公共库(并实现它)
.Net Standard 2.0
公共库
我正在尝试创建 .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 代码库中使用该库,该库应该执行以下操作之一:
- 目标 netstandard2.0 - 如果您在实现中不需要任何特定于框架的东西
- 多目标 netcoreapp3.1 和 netstandard2.0 - 如果您想在可用时使用 netcoreapp3.1 功能,否则使用下层通用实现
- 多目标 netcoreapp3.1 和 net472 - 如果实现完全是特定于平台的并且不可能有通用实现
多目标就像更改 csproj 一样简单:
<TargetFramework>netcoreapp3.1</TargetFramework>
到
<TargetFrameworks>netcoreapp3.1;netstandard2.0</TargetFrameworks>
您会自动获得一个 NETCOREAPP3_1
或 NETSTANDARD2_0
构建符号,您可以使用 #if
进行测试,或者您可以通过条件在 csproj 中做出其他决定,例如:
<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0' OR '$(TargetFramework)'=='netcoreapp3.0'">
<PackageReference Include="System.Data.SqlClient" Version="4.6.1" />
</ItemGroup>