为什么我不能 运行 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。我还使用 dnvm、dnvm 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。
- 克隆位于 https://github.com/dotnet/coreclr 的 dotnet/coreclr 存储库的主分支。
- 通过在根存储库目录中键入以下命令来构建 CoreCLR 的源代码:
build.cmd release arm
。
这将使用 Release 配置为 ARM 构建源代码。
在我的机器上构建大约需要半个小时。
- 构建完成后,二进制文件在
bin\Product\Windows_NT.arm.Release
目录中可用。将整个目录复制到您的 Windows 10 IoT Core(例如复制到 C:\netcore\coreclr
)。
现在,您必须将 .NET Core 应用程序部署到您的 Windows 10 IoT Core 设备:
- 在project.json文件中指定
win10-arm
运行时间。
- 移除 "Microsoft.NETCore.App" 依赖的
"type": "platform"
属性。
dotnet restore
dotnet publish -c Release -r win10-arm
(或者 -c Debug
如果你想要调试配置)
- 您的应用程序发布包现已在
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"
目前我正在使用 Windows 10 IoT Core 和新的 .NET Core 库测试一些家庭自动化。我已经使用最新的 Windows 10 IoT Core (10.0.10586) 稳定版设置了香草 Rasberry PI 2。我还使用 dnvm、dnvm 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。
- 克隆位于 https://github.com/dotnet/coreclr 的 dotnet/coreclr 存储库的主分支。
- 通过在根存储库目录中键入以下命令来构建 CoreCLR 的源代码:
build.cmd release arm
。 这将使用 Release 配置为 ARM 构建源代码。 在我的机器上构建大约需要半个小时。 - 构建完成后,二进制文件在
bin\Product\Windows_NT.arm.Release
目录中可用。将整个目录复制到您的 Windows 10 IoT Core(例如复制到C:\netcore\coreclr
)。
现在,您必须将 .NET Core 应用程序部署到您的 Windows 10 IoT Core 设备:
- 在project.json文件中指定
win10-arm
运行时间。 - 移除 "Microsoft.NETCore.App" 依赖的
"type": "platform"
属性。 dotnet restore
dotnet publish -c Release -r win10-arm
(或者-c Debug
如果你想要调试配置)- 您的应用程序发布包现已在
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"