.NET Core 3.1 控制台应用程序无法在 Windows 7 上运行。

4
我使用最新的Visual Studio 2019创建了一个.NET Core 3.1 AnyCpu控制台应用程序。它唯一的代码是使用Console.WriteLine("Hello World!")创建的样板代码。我编译并在我的Windows 10 x64计算机上运行,没有问题。
我将Debug文件夹复制到32位的Windows 7计算机上,并尝试运行控制台应用程序。我收到以下消息(Windows 7计算机上安装了.NET Core 3.1运行时):

此文件版本与您正在运行的Windows版本不兼容。请查看您计算机的系统信息,以确定您是否需要运行32位(x86)或64位(x64)程序的版本,然后联系软件发布者。

但是,如果我使用x86编译控制台应用程序,那么在Windows 7计算机上它将正常运行。使用VS2019和.NET Core 3/3.1,AnyCpu是否有更改?我本来认为,针对AnyCpu编译的代码应该可以在32位和64位下正常工作。

你的Windows 7系统上是否安装了.Net框架? - user13094861
你不能简单地从一台机器复制到另一台机器。只有在构建和部署的Net版本相同时,复制才能起作用。当你有不同版本的Net时,你必须部署应用程序,安装/更新dlls以匹配构建机器。 - jdweng
我上个月读到了AnyCPU默认为32位模式。所以我认为你实际上是在编译32位而不是64位。 - jdweng
如果是这样的话,为什么我在32位Windows 7上会出现错误,但在64位Windows 10上却可以正常运行呢? - making
这个回答解决了你的问题吗?在 Visual Studio 中使用“Prefer 32-bit”选项,在控制台应用程序(.NET Core)下生成了64位代码。根据我从阅读该答案和作者博客中所理解的,除了x86以外的任何目标都会产生PE32+ .exe文件,并且PE32+ .exe文件将作为64位进程启动。不太确定它是如何相关的,但我发现在发布时针对win-x86运行时可以生成一个x86.exe,即使在64位Windows 10上也是如此。 - Lance U. Matthews
显示剩余3条评论
1个回答

3
看起来,在 .NET Core 3 中,AnyCpu 的工作方式发生了变化。在 .NET Framework 中,.exe 文件是托管的,因此使用 AnyCpu 时,它会在运行时 JIT 编译成所需的 x86 或 x64 平台。但在 .NET Core 中,使用 AnyCpu 时,.exe 文件是一个纯粹的非托管 exe 文件,根据编译机器的架构(x86/x64)进行编译。然而,它创建的 dll 包含托管代码,并且可以使用 DotNet.exe 在 32 位机器上运行。
解决方案不是在 32 位机器上编译,因为这只会在 32 位模式下启动该 dll。实际上,解决方案是不使用 .exe 文件,而是使用本地副本的 DotNet.exe 启动 dll。
来源:https://mihai-albert.com/2020/03/08/startup-sequence-of-a-dotnet-core-app/

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