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

时间:2016-07-30 19:41:40

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

目前,我正在使用Windows 10 IoT Core和新的.NET Core库测试一些家庭自动化。我使用最新的稳定版Windows 10 IoT Core(10.0.10586)设置了一个带有Rasilla 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" - 属性。因此我明确地添加了两个运行时:

{
  "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执行应用程序给了我迄今为止遇到的最奇怪的错误:

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

所以程序无法运行,因为......好......成功?

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

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

提前致谢!

3 个答案:

答案 0 :(得分:3)

我使用Raspberry Pi3在Windows 10 IoT核心RTM 10.0.14393.576上工作。

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

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

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

    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核心(例如,复制到C:\netcore\apps\MyApp)。
    6. 现在您只需使用CoreRun.exe工具运行您的应用。最重要的是你必须指定DLL文件,而不是EXE

      C:\netcore\coreclr\CoreRun.exe "C:\netcore\apps\MyApp\MyApp.dll"
      

答案 1 :(得分:2)

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

  ARM的dotnet是概念质量状态的证明。事实上,它完全被打破了。 ; - )

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

答案 2 :(得分:1)

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