Консольное приложение .NET Core 3.1 не будет работать в Windows 7

Я создал консольное приложение .NET Core 3.1 AnyCpu с помощью Visual Studio 2019 с последними исправлениями. Единственный код, который он содержит, - это шаблон Console.WriteLine("Hello World!"), с помощью которого он был создан. Я компилирую это, и он отлично работает на моем компьютере с Windows 10 x64.

Я копирую папку Debug в свой 32-разрядный Windows 7 и пытаюсь запустить консольное приложение. Получаю следующее сообщение. (Среда выполнения .Net Core 3.1 установлена ​​в Windows 7).

Версия этого файла несовместима с используемой вами версией Windows. Проверьте системную информацию вашего компьютера, чтобы узнать, нужна ли вам версия программы x86 (32-разрядная) или x64 (64-разрядная), а затем обратитесь к издателю программного обеспечения.

Однако, если я компилирую консольное приложение с использованием x86, оно отлично работает в Windows 7. В VS2019 и .NET Core 3 / 3.1 AnyCpu изменилось? Я ожидал, что код, скомпилированный для AnyCpu, должен нормально работать в 32- и 64-битных версиях.


person making    schedule 07.07.2020    source источник
comment
У вас есть .Net framework на Windows 7?   -  person    schedule 07.07.2020
comment
Да, я сказал это в моем исходном сообщении (среда выполнения .Net Core 3.1 установлена ​​в окне Windows 7), и если я скомпилирую проект как x86, он будет работать в Windows 7.   -  person making    schedule 07.07.2020
comment
Вы не можете просто копировать с одной машины на другую. Только когда одна и та же версия Net находится на Build and Deploy, копирование будет работать. Если у вас разные версии Net, вы должны развернуть приложение, которое устанавливает / обновляет библиотеки DLL на машине развертывания в соответствии с машиной сборки.   -  person jdweng    schedule 07.07.2020
comment
До тех пор, пока я не начал использовать ядро ​​.Net, я компилировал приложения как AnyCpu и копировал их без проблем. Я убедился, что на обоих установлена ​​одна и та же версия среды выполнения .Net. Как я уже сказал, если я скомпилирую приложение как x86, оно будет работать нормально. Я попробую развернуть.   -  person making    schedule 07.07.2020
comment
При компиляции и запуске опубликованной версии я все еще получаю ту же ошибку. Мне кажется, что он компилируется для x64, возможно, несмотря на то, что он установлен на AnyCpu.   -  person making    schedule 07.07.2020
comment
В прошлом месяце я прочитал AnyCPU по умолчанию, поэтому 32-битный режим. Так что я думаю, что вы действительно компилируете для 32, а не для 64.   -  person jdweng    schedule 07.07.2020
comment
Если это было так, почему я получаю сообщение об ошибке в 32-битной Windows 7, но она отлично работает в 64-битной версии, но в Windows 10.   -  person making    schedule 07.07.2020
comment
Отвечает ли это на ваш вопрос? «Предпочитать 32-разрядный »в Visual Studio создает 64-разрядный код в консольном приложении (.NET Core). Как я понял из этого ответа и небольшой части блога автора, ориентация на что-либо другое, кроме x86, приведет к созданию файла PE32 + .exe, а файл PE32 + .exe будет запущен как 64-битный процесс. Не совсем уверен, как это связано, но я обнаружил, что ориентация на win-x86 среду выполнения при публикации дает x86 .exe даже в 64-битной Windows 10.   -  person Lance U. Matthews    schedule 08.07.2020


Ответы (1)


Похоже, что произошли изменения в способе работы AnyCpu в .Net Core 3. В .NET Framework .exe был управляемым исполняемым файлом, поэтому с AnyCpu он JIT'ed во время выполнения для всех требуемых x86 или x64 **. В .Net Core с использованием AnyCpu .Exe - это простой неуправляемый exe-файл, скомпилированный для x86 / x64 в зависимости от архитектуры вашего компьютера, выполняющего компиляцию. Однако созданная им dll содержит управляемый код и может быть запущена на 32-битной машине с помощью DotNet.exe.

Решение состоит в том, чтобы не компилировать на 32-битной машине, так как это просто запускает dll в 32-битном режиме. На самом деле решение состоит в том, чтобы не использовать .exe и запускать dll с локальной копией DotNet.exe.

** источник: https://mihai-albert.com/2020/03/08/startup-sequence-of-a-dotnet-core-app/

person making    schedule 07.07.2020