如何在 .NET Framework 应用程序中使用 .NET Core DLL?

3
我想我知道这个问题的答案,但还是想确认一下。我们正在尝试使用 .net core 技术。我们想要用 .net core 编写一些dll文件,但又不想在每台工作站上都安装 .net core 运行时。如果你正在做一个 .net core exe 文件,你可以将运行时嵌入到应用程序中,这样就不必在每台机器上安装 .net core。

我们要推送的所有机器都是已安装 .net framework 的 Windows 机器。如果我们想要使用 .net core 的 dll 文件,那么我们需要安装 .net core 运行时,对吗?

谢谢...


只是试一试。反正有很多重复的问题,创建两个项目并尝试相互引用是更快的解决办法。 - Panagiotis Kanavos
1
无论如何,如果您希望您的代码可重用,您应该创建.NET标准库。完整或核心库将期望找到BCL类的完整或核心版本。标准库将使用可执行文件运行时提供的类。 - Panagiotis Kanavos
要在非核心应用程序中使用dll,您需要使用.net标准并将dll多目标化,它将为您指定的每个框架类型构建库并打包。 - hawkstrider
1
你不能这样做,因为 .netcore 程序集的目标运行时程序集在桌面版框架中不可用。它是一个非常根本性不同的运行时,例如完全不同的 CLR 版本,从文档中很难看出来。针对 .netstandard 是逐步切换的一种方式,但要注意许多类将会缺失。 - Hans Passant
.NET Standard是针对.NET Core和.NET Framework的良好选择。目前它确实有一定的限制,但正在不断改进中。请在此处查找兼容版本链接 - Mausam
3个回答

1

根据我正确理解微软的文档,看起来对于.NET 5/6,你的问题的答案是否定的。看起来你可以在.NET Framework中使用的最新版本是.NET Standard 2.0。

.NET Standard是一个正式的规范,定义了可在多个.NET实现上使用的.NET API。制定.NET Standard的动机是为了在.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上发布,请考虑可达性和可用功能集之间的权衡。.NET 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+的客户端的最新平台功能。

-1
这是一个示例csproj文件,来自我们使用的.net标准dll,被.net core和.net framework应用程序所使用。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

回答

是的,除非.NET应用程序以自包含方式发布,否则需要.NET(.NET Core)。.NET(.NET Core)并不是为在.NET Framework上运行而设计的。

https://learn.microsoft.com/en-us/dotnet/core/introduction#deployment-models

https://dotnet.microsoft.com/en-us/download


附加的 .NET 兼容性信息

不同的 .NET 实现包括:

  • .NET
  • .NET Framework
  • Mono
  • UWP

https://learn.microsoft.com/en-us/dotnet/fundamentals/implementations

针对特定实现的应用程序/动态链接库通常与其他实现不兼容:
https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-2-0#api-changes-and-library-support)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接