【问题标题】:Why can't I run a basic .NET Core application on a Win10 ARM system?为什么我不能在 Win10 ARM 系统上运行基本的 .NET Core 应用程序?
【发布时间】:2016-07-30 19:41:39
【问题描述】:

目前我正在使用 Windows 10 IoT Core 和新的 .NET Core 库测试一些家庭自动化。我已经使用最新稳定版本的 Windows 10 IoT Core (10.0.10586) 设置了香草 Rasberry PI 2。我还使用 dnvm 安装了当前最新的 (RC2-20221) .NET 包,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 文件,从中删除了“Microsoft.NETCore.App”依赖项的"type": "platform"-property。因此,我明确添加了两个运行时:

{
  "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-build 部署到我的 Rasberry PI 后,尝试从 powershell 执行应用程序给了我迄今为止遇到的最奇怪的错误:

程序“IoT.Samples.Console.exe”运行失败:操作成功完成。
    + CategoryInfo : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed

所以程序运行失败,因为……嗯……成功了?

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

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

提前致谢!

【问题讨论】:

  • 我正在按照本教程在 RP2 上创建 .NET Core 应用程序,它可以工作。
  • 你在学习任何教程吗?
  • 你的应用在 W10 IoT Core 上运行了吗?
  • @Darxis 不幸的是没有。 ://

标签: c# .net arm windows-10-iot-core .net-core


【解决方案1】:

我让它在带有 Raspberry Pi3 的 Windows 10 IoT Core RTM 10.0.14393.576 上运行。

问题是您必须使用 CoreCLR 中提供的 CoreRun.exe 工具来启动您的 .NET Core 应用程序。

首先,您必须构建 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"

【讨论】:

  • 谢谢,这看起来很有希望!我还没有时间在我的 RaspPI 2 上尝试这个,但无论如何我都会接受这个答案,因为它描述了一个有效的解决方法并与其他答案匹配。猜猜在我问这个问题时,dnc 还没有准备好完成这项任务。无论如何,再次感谢。 :)
【解决方案2】:

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

用于 ARM 的 dotnet 处于概念验证质量状态。事实上,它已经完全崩溃了。 ;-)

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

【讨论】:

  • Sumsang 已加入 .NET 基金会,致力于这方面的工作,因此很有希望。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2014-05-24
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多