Почему я не могу запустить базовое приложение .NET Core в системе Win10 ARM?

В настоящее время я тестирую домашнюю автоматизацию с использованием Windows 10 IoT Core и новых библиотек .NET Core. Я установил ванильный Rasberry PI 2 с последней стабильной версией Windows 10 IoT Core (10.0.10586). Я также установил самые последние пакеты .NET (RC2-20221) с помощью dnvm, dnvm list отображает:

Active Version           Runtime Architecture OperatingSystem Alias
------ -------           ------- ------------ --------------- -----
   1.0.0-rc1-final   clr     x86          win
   1.0.0-rc1-final   coreclr arm          win
   1.0.0-rc1-final   coreclr x64          win
   1.0.0-rc1-final   coreclr x86          win
   1.0.0-rc1-update2 clr     x86          win             default, dnx-clr-win-x86.1.0.0-rc1-update2
   1.0.0-rc2-20221   clr     x64          win
   1.0.0-rc2-20221   clr     x86          win
   1.0.0-rc2-20221   coreclr arm          win
*  1.0.0-rc2-20221   coreclr x64          win
   1.0.0-rc2-20221   coreclr x86          win

Затем я создал новое консольное приложение (.NET Core), которое не делает ничего, кроме вывода строки:

public class Program
{
    public static void Main(string[] args)
    {
        System.Console.WriteLine($"Hello Raspberry {Math.PI}!");
    }
}

Я также обновил файл project.json, из которого удалил свойство "type": "platform" зависимости "Microsoft.NETCore.App". Поэтому я явно добавил две среды выполнения:

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0"
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  },

  "runtimes": {
    "win10-x64": {},
    "win10-arm": {}
  }
}

Первая среда выполнения (win10-x64) предназначена для тестирования приложения на моем компьютере для разработки, последняя — для развертывания. Я могу успешно собрать свое приложение, используя следующую команду:

dotnet publish --output "X:\Dev\IoT\Samples\Console\output" --runtime win10-arm

Сборка проекта с параметром времени выполнения win10-x64 в командной строке работает, как и ожидалось: я получаю полнофункциональный исполняемый файл, который выводит нужную строку на мою консоль. После развертывания сборки win10-arm на моем Rasberry PI попытка выполнить приложение из powershell дает мне самую странную ошибку, с которой я когда-либо сталкивался:

Program 'IoT.Samples.Console.exe' failed to run: The operation completed successfully.
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed

Итак, программа не запускается, потому что... ну... успех?

Я следовал инструкциям здесь для подключения к RaspPI с помощью PowerShell. Кроме того, как и ожидалось, запуск сборки ARM с моей x64-машины не работает. Таким образом, очевидно, что приложение правильно скомпилировано для ARM.

Так почему же powershell отвечает ошибкой? И что мне эта ошибка говорит?

Заранее спасибо!


person Carsten    schedule 30.07.2016    source источник
comment
Я следую этому руководству, чтобы создать приложение .NET Core на RP2, и оно работает.   -  person Jackie    schedule 02.08.2016
comment
Вы следуете какому-либо учебнику?   -  person Jackie    schedule 02.08.2016
comment
У вас есть приложение, работающее на W10 IoT Core?   -  person Darxis    schedule 29.12.2016
comment
@Darxis, к сожалению, нет. :/   -  person Carsten    schedule 29.12.2016


Ответы (3)


Я заработал на Windows 10 IoT Core RTM 10.0.14393.576 с Raspberry Pi3.

Дело в том, что вам нужно запустить приложение .NET Core с помощью инструмента CoreRun.exe, доступного в CoreCLR.

Во-первых, вам нужно создать и развернуть CoreCLR в Windows 10 IoT Core.

  1. Клонируйте основную ветку репозитория dotnet/coreclr по адресу https://github.com/dotnet/coreclr. .
  2. Соберите исходники CoreCLR, введя следующую команду из корневого каталога репозитория: build.cmd release arm. Это создаст исходники для ARM с конфигурацией Release. На моей машине сборка занимает примерно полчаса.
  3. После завершения сборки двоичные файлы доступны в каталоге bin\Product\Windows_NT.arm.Release. Скопируйте весь этот каталог в Windows 10 IoT Core (например, в C:\netcore\coreclr).

Теперь вам нужно развернуть приложение .NET Core на устройстве Windows 10 IoT Core:

  1. Укажите среду выполнения win10-arm в файле project.json.
  2. Удалите свойство "type": "platform" зависимости "Microsoft.NETCore.App".
  3. dotnet restore
  4. dotnet publish -c Release -r win10-arm (или -c Debug, если вам нужна конфигурация отладки)
  5. Пакет публикации вашего приложения теперь доступен в каталоге bin\Release\netcoreapp1.0\win10-arm\publish. Скопируйте этот каталог в Windows 10 IoT Core (например, в C:\netcore\apps\MyApp).

Теперь вам нужно просто запустить свое приложение с помощью инструмента CoreRun.exe. Самое главное, что вы должны указать файл DLL, а не EXE.

C:\netcore\coreclr\CoreRun.exe "C:\netcore\apps\MyApp\MyApp.dll"
person Darxis    schedule 29.12.2016
comment
Спасибо, это выглядит многообещающе! Я еще не нашел времени, чтобы попробовать это на моем RaspPI 2, но я все равно приму ответ, поскольку он описывает допустимый обходной путь и совпадает с другими ответами. Думаю, в то время, когда я задавал вопрос, DNC не был готов к этой задаче. В любом случае, еще раз спасибо. :) - person Carsten; 29.12.2016


согласно https://blogs.msdn.microsoft.com/dotnet/2016/07/15/net-core-roadmap/ мы получим поддержку ARM32/64 в четвертом квартале 2016 года или в первом квартале 2017 года.

person Gavin Fang    schedule 31.07.2016