为什么我不能 运行 Win10 ARM 系统上的基本 .NET Core 应用程序?

Why can't I run a basic .NET Core application on a Win10 ARM system?

目前我正在使用 Windows 10 IoT Core 和新的 .NET Core 库测试一些家庭自动化。我已经使用最新的 Windows 10 IoT Core (10.0.10586) 稳定版设置了香草 Rasberry PI 2。我还使用 dnvmdnvm list 显示安装了当前最新的 (RC2-20221) .NET 包:

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 文件,我从中删除了 [=44= 的 "type": "platform"-属性 ] 依赖。因此,我明确地添加了两次 运行 次:

{
  "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

在命令行中使用 运行time 参数 win10-x64 构建项目按预期工作:我得到一个功能齐全的可执行文件,它将所需的字符串打印到我的控制台。将 win10-arm-build 部署到我的 Rasberry PI 后,尝试从 powershell 执行应用程序给了我迄今为止遇到的最奇怪的错误:

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

所以程序失败 运行,因为...好吧...成功?

我按照说明 here 使用 Powershell 连接到 RaspPI。此外,正如预期的那样,运行从我的 x64 机器构建 ARM 不起作用。很明显,应用程序已为 ARM 正确编译。

那么为什么 powershell 响应错误?这个错误告诉我什么?

提前致谢!

如果您查看与 CoreCLR for ARM 相关的 GitHub 问题,您会发现最近的评论,例如 this one:

dotnet for ARM is in proof of concept quality state. In fact it is completely broken. ;-)

我认为它还没有准备好...

根据https://blogs.msdn.microsoft.com/dotnet/2016/07/15/net-core-roadmap/ 我们将在 2016 年第四季度或 2017 年第一季度获得 ARM32/64 支持

我在 Windows 10 IoT Core RTM 10.0.14393.576 和 Raspberry Pi3 上工作。

问题是您必须使用 CoreRun.exe 工具启动您的 .NET Core 应用程序,该工具在 CoreCLR 中可用。

首先,您必须构建 CoreCLR 并将其部署到您的 Windows 10 IoT Core。

  1. 克隆位于 https://github.com/dotnet/coreclr 的 dotnet/coreclr 存储库的主分支。
  2. 通过在根存储库目录中键入以下命令来构建 CoreCLR 的源代码:build.cmd release arm。 这将使用 Release 配置为 ARM 构建源代码。 在我的机器上构建大约需要半个小时。
  3. 构建完成后,二进制文件在 bin\Product\Windows_NT.arm.Release 目录中可用。将整个目录复制到您的 Windows 10 IoT Core(例如复制到 C:\netcore\coreclr)。

现在,您必须将 .NET Core 应用程序部署到您的 Windows 10 IoT Core 设备:

  1. project.json文件中指定win10-arm运行时间。
  2. 移除 "Microsoft.NETCore.App" 依赖的 "type": "platform" 属性。
  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"