在不同的框架上运行.NET Standard二进制文件

6
我了解目标 .NET Standard 2 意味着 .net core、mono 和完整的 .net framework 之间的框架,但我想了解这对不同框架创建的二进制文件意味着什么。
那么如果我创建一个针对 .NET Standard 2 的控制台程序,并使用 .NET Framework 进行编译,那么只有完整的 .NET Framework 可以运行该文件吗?如果它们都可以运行文件,我该如何使用完整的框架或 Mono 运行 .NET Core 的 .dll 可执行控制台?
基本上说,每个框架创建的二进制文件(针对 .NET Standard)能否使用其他框架来运行?

3
您无法创建 .NET Standard 控制台程序。它只适用于库。可执行文件必须针对运行时目标。可执行文件包括控制台应用程序、网站和单元测试类库。这些可执行文件可以引用相同的 .NET Standard 库。 - Panagiotis Kanavos
@PanagiotisKanavos 哇,我甚至从未考虑过这点 - 没有看到关于类库和可执行文件之间差异的任何信息。到目前为止,我所能看到的最接近的信息是 https://github.com/dotnet/corefx/issues/18217#issuecomment-293394403 ,那里面的一些答案很有趣,但是当解释 .net standard 时没有更多地指明这一点,这有点奇怪(至少我在任何地方都没有看到)。 - Mladen Mihajlovic
1
实际上,你可以创建一个.NET Standard控制台应用程序,但它不会运行,因为.NET Standard没有运行时。这意味着你必须自己琢磨,直到找出你做错了什么。 - NightOwl888
@NightOwl888,问题在于我认为将exe编译为.net标准很合理,但必须显式地使用运行时来运行它,例如:dotnet exec.dll,但使用.net标准编译它不会报错,但无法运行。如果你问我,这很令人困惑。这也表明它可能在未来被允许或者在某个阶段计划过(参考我之前链接的问题)。 - Mladen Mihajlovic
@MladenMihajlovic - 不,这是不可能的。dotnet应用程序运行在.NET Core上。它加载的程序集必须在.NET Core上可执行 - 它必须针对.NET Core(并且可以依赖于.NET Standard DLL)。您还可以为.NET Core创建自包含部署,其中包含一个.exe文件,无需dotnet.exe即可运行。 - NightOwl888
@MladenMihajlovic - 我认为令人困惑的部分是,.NET Standard经常被宣传为“与.NET Core密切相关”。但实际上并非如此。.NET Core是一个运行时环境,而.NET Standard是一个可移植性平台,可以与多个运行时环境一起使用,包括.NET Core。.NET Core的特性(例如通过dotnet.exe执行)与.NET Standard无关。 - NightOwl888
1个回答

15

我相信与可移植类库的比较部分可能是最好的解释:

.NET Standard 取代了可移植类库 (PCL)

.NET Standard 并不是一个运行时,它只是一种多个不同运行时的类型转发机制。因此,在 .NET Standard 中只能创建非可执行的类库,就像 PCL 一样。

这使得类库可以被针对特定运行时(.NET Framework、.NET Core、Xamarin.iOS、Mono 等)的可执行程序集所使用。

把这个看作类和接口可能更有帮助。在伪代码中,.NET Standard 是 .NET Framework 和 .NET Core 实现的接口。

public interface INetStandard
{
    // Only has API definitions
}

public class NetFramework : INetStandard
{
    // .NET Framework Runtime implemented here
}

public class NetCore : INetStandard
{
    // .NET Core Runtime implemented here
}

这使得在.NET Framework或.NET Core中使用.NET Standard成为可能,但.NET Standard本身没有运行时,只有一组可以在运行时之间共享的API。你可以针对这三个中的任何一个来定位你的项目,但你不能执行.NET Standard,就像你无法实例化一个接口一样。

不幸的是,你并不是第一个提出这个问题的人,除非微软让文档更加清晰,说明.NET Standard实际上并不执行,否则你很可能不是最后一个提出这个问题的人。


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