dotnet core 3.1独立应用程序失败,并显示“无此文件或目录”,我是否缺少依赖项?

问题描述

我只是试图在NVidia Jetson Nano上运行dotnet内核。

我已经在dotnet核心中创建了一个简单的“ hello world”应用程序,并将其打包为针对linux-arm的独立应用程序。 将其放在Synology NAS上时,我可以直接导航到发布并键入./HellodotNetCore并运行该应用程序,尽管有一些错误

/HellodotNetCore/HellodotNetCore/bin/Release/netcoreapp3.1/linux-arm$ ./HellodotNetCore
./HellodotNetCore: /lib/libstdc++.so.6: no version information available (required by ./HellodotNetCore)
./HellodotNetCore: /lib/libstdc++.so.6: no version information available (required by ./HellodotNetCore)
./HellodotNetCore: /lib/libstdc++.so.6: no version information available (required by ./HellodotNetCore)
./HellodotNetCore: /lib/libstdc++.so.6: no version information available (required by ./HellodotNetCore)
./HellodotNetCore: /lib/libstdc++.so.6: no version information available (required by ./HellodotNetCore)
Hello World!

我可以在我的RaspBerry Pi上以sudo的方式运行

/HellodotNetCore/HellodotNetCore/bin/Release/netcoreapp3.1/linux-arm $ sudo ./HellodotNetCore
Hello World!

我已按照此处的教程“安装”了dotnet内核: https://blog.headforcloud.com/2019/04/03/jetson-nano-a-quick-start-with-.net-core-3/ (实际上不是安装,只是将二进制文件暴露给bash)

/code/HellodotNetCore/HellodotNetCore$ dotnet run
Hello World!

但是,尝试在NVidia Jetson上将其作为独立应用程序运行会导致“没有这样的文件或目录”。我已经尝试过使用chmod + x和chmod 777这两个古老的明显技巧,并以sudo的身份运行,但是没有其他线索可以找到它的内容了。

/code/HellodotNetCore/HellodotNetCore/bin/Release/netcoreapp3.1/linux-arm$ ./HellodotNetCore
-bash: ./HellodotNetCore: No such file or directory

因此似乎没有应该与该独立应用程序打包的东西,但是我对于如何弄清楚它需要什么一无所知。有什么想法吗?

解决方法

我找到了罪魁祸首。 NVidia Jetson的运行时需要显式设置为linux-arm64,而不是linux-arm。如果您使用dotnet命令从Jetson运行应用程序

dotnet run

它将把应用程序编译到相关的debug或release文件夹中,然后您可以使用

从该文件夹运行它

./HelloDotNetCore

但是,为了从Visual Studio中“发布”应用程序,我不得不从此处通过NuGet更新我的Microsoft.NETCore.Platforms包。 https://www.nuget.org/packages/Microsoft.NETCore.Platforms/ 这会自动将我的.csproj文件更新为

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.Platforms" Version="3.1.3" />
  </ItemGroup>

</Project>

然后手动更改.pubxml文件的RuntimeIdentifier元素以反映linux-arm64体系结构。

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>Any CPU</Platform>
    <PublishDir>bin\Release\netcoreapp3.1\publish\</PublishDir>
    <PublishProtocol>FileSystem</PublishProtocol>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
    <SelfContained>true</SelfContained>
    <PublishSingleFile>True</PublishSingleFile>
    <PublishTrimmed>False</PublishTrimmed>
  </PropertyGroup>
</Project>

然后我能够使用Visual Studio中的publish命令发布该应用程序,该命令在名为“ publish”的文件夹中构建了一个独立的应用程序

现在,我得到了预期的结果。

Jetson:/code/publish$ ./HelloDotNetCore
Hello World!