【问题标题】:Using a .net core dll with .net framework app?将 .net 核心 dll 与 .net 框架应用程序一起使用?
【发布时间】:2022-04-29 23:32:27
【问题描述】:

我想我知道这个问题的答案,但想确定一下。我们正试图涉足 .net 核心。我们想在 .net core 中编写一些 dll,但我们希望避免将 .net core 运行时推送到每个工作站。我知道如果你正在做一个 .net core exe,你可以将运行时嵌入到应用程序中,这样你就不必在每台机器上物理安装 .net core。

我们推送的所有机器都是已经安装了 .net 框架的 Windows 机器。如果我们想使用能够使用 .net 核心 dll,那么我们就必须安装 .net 核心运行时,不是吗?

谢谢....

【问题讨论】:

  • 试试吧。反正有很多重复的问题,但是用两个项目创建一个解决方案并尝试从另一个项目中引用一个解决方案会更快
  • 无论如何,如果您希望您的代码可重用,您应该创建 .NET Standard 库。完整或核心库将期望找到 BCL 类的完整或核心版本。标准库将使用可执行文件的运行时提供的类
  • 要将 dll 用于非核心应用程序,您需要使用 .net 标准并多目标您的 dll,它将为您在包中指定的每个框架类型构建库。
  • 你不能,.netcore 程序集以桌面版框架中不可用的运行时程序集为目标。这是一个完全不同的运行时,例如完全不同的 CLR 版本,从文档中不那么容易看到。定位 .netstandard 是一种逐渐切换的方式,但要注意会丢失很多类。
  • .NET Standard 是面向 .NET Core 和 .NET Framework 的不错选择。目前肯定是有限的,但正在改善。请查找兼容版本here

标签: .net-core


【解决方案1】:

以下是我们使用的 .net 标准 dll 中的示例 csproj 文件,该文件由 .net 核心和 .net 框架应用程序使用。 TargetFrameworks 用于指定要使用的框架。常量是为可能需要执行的任何特定于框架的代码定义的。在我们的案例中,我们有特定的实例,其中框架与核心的代码略有不同

<PropertyGroup>

   <TargetFrameworks>netstandard1.3;netstandard2.0;net452;net461;net471</TargetFrameworks>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <Copyright>...</Copyright>
    <Company>...</Company>
    <Authors>...</Authors>
    <Description>...</Description>
    <Version>1.0.20</Version>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
    <DefineConstants>TRACE;DEBUG;</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
    <DefineConstants>NETSTANDARD2_0;</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='netstandard1.3'">
    <DefineConstants>NETSTANDARD1_3;</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='net471'">
    <DefineConstants>NET471;</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='net461'">
    <DefineConstants>NET461;</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='net452'">
    <DefineConstants>NET452;</DefineConstants>
  </PropertyGroup>

【讨论】:

    【解决方案2】:

    如果我正确理解 Microsoft 的 documentation,对于 .NET 5/6,您的问题的答案似乎是否定的。您可以与 .NET Framework 一起使用的最新版本似乎是 .NET Standard 2.0。

    .NET Standard 是 .NET API 的正式规范,它是 可用于多个 .NET 实现。 .NET 背后的动机 标准是在 .NET 生态系统中建立更大的统一性。 .NET 5 及更高版本采用不同的方法来建立 在大多数情况下消除对 .NET Standard 的需求的一致性 情景。但是,如果您想在 .NET Framework 之间共享代码 以及任何其他 .NET 实现,例如 .NET Core,您的库 应以 .NET Standard 2.0 为目标。没有新版本的 .NET Standard 将 已发布,但 .NET 5、.NET 6 和所有未来版本将继续 支持 .NET Standard 2.1 及更早版本。

    如果您正在构建计划在 NuGet 上发布的可重用库, 考虑范围和可用功能集之间的权衡。 。网 Standard 2.0 是 .NET Framework 支持的最新版本, 因此它通过相当大的功能集提供了良好的覆盖范围。我们不 建议以 .NET Standard 1.x 为目标,因为您会限制可用的 功能集以最小化覆盖范围。如果你不需要 支持 .NET Framework,您可以使用 .NET Standard 2.1 或 .NET 5/6。我们建议您跳过 .NET Standard 2.1 并直接使用 .NET 6. 最广泛使用的库将为 .NET Standard 2.0 和 .NET 5+ 提供多目标。支持 .NET Standard 2.0 可为您提供最大的覆盖范围,而支持 .NET 5+ 可确保您利用最新的 为已经使用 .NET 5+ 的客户提供平台功能。

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多