【问题标题】:Using .NET Core-specific code in a multi-framework Project在多框架项目中使用 .NET Core 特定代码
【发布时间】:2018-09-25 12:20:08
【问题描述】:

我的任务是在工作中开始从 .NET Framework (4.7.1) 到 .NET Core (2.1) 的“缓慢迁移”。我们有一个非常大的应用程序,不能简单地在 .NET Core 中停止开发并创建一个全新的堆栈。我已经通过将 .NET Standard (2.0) 库作为 .NET Framework 和 .NET Core 项目的“过渡”来工作。但是,我遇到了一些特定于核心的代码的问题。

我的 .NET Core .csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netcoreapp2.1;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

</Project>

我必须添加 netstandard2.0 并使其成为多框架以将接口包含在我们的标准库中。

当我这样做时,在尝试使用仅在 Core 中的代码时会遇到各种构建错误。例如,我收到以下错误:

“文件”不包含“AppendAllTextAsync”的定义。

在我们删除 .NET Framework 和 Standard 代码之前,有什么方法可以在我们的应用程序中利用甚至拥有新功能? (我在一个新的解决方案中尝试了一个全新的 .NET Core 项目,它运行良好,直到我将 .csproj 更改为 TargetFrameworks

【问题讨论】:

  • 在此上下文中的多目标意味着可以针对多个平台编译程序集,但如果它们使用不同的 API 集,则它不能在不同平台上同样工作。因此,为了只拥有新功能,您需要提供条件如何使用 #if, etc 等预处理器指令针对不同平台编译代码。为了利用,您需要走得更远,并为您要支持的每个平台提供足够的理想行为替代。

标签: c# .net-core .net-standard


【解决方案1】:

您正在针对 .NET Core 2.1 和 .NET Standard 2.0 进行构建。 .NET Core 是 .NET Standard 的超集,这意味着它具有标准以及更多内容。 File.AppendAllTextAsync 就是其中之一。

.NET Core:https://docs.microsoft.com/en-us/dotnet/api/?view=netcore-2.1&term=AppendAllTextAsync

.NET 标准:https://docs.microsoft.com/en-us/dotnet/api/?view=netstandard-2.0&term=AppendAllTextAsync

不幸的是,您不能简单地针对 .NET 标准交叉编译该代码。如果您愿意,您可以使用#if 符号来编写特定于框架的代码。或者,您可以坚持使用 .NET Standard 中支持的代码,例如,您可以使用非异步变体:https://docs.microsoft.com/en-us/dotnet/api/?view=netstandard-2.0&term=AppendAllText

【讨论】:

  • 感谢您的澄清。我现在将使用#if NETCOREAPP2_1 指令,并暂时填充一些功能。这样,一旦我们完成向 .NET Core 的切换,我们所要做的就是删除这些指令的另一端,所有其他代码都可以继续使用。
  • 听起来是个公平的计划。 API 浏览器确实帮助我找到了适用于 .NET Standard 的 API。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2016-07-07
相关资源
最近更新 更多