C# 无法在CentOS amd64上执行二进制文件

C# 无法在CentOS amd64上执行二进制文件,c#,linux,bash,.net-core,x86-64,C#,Linux,Bash,.net Core,X86 64,我正在尝试在CentOS上运行一个简单的程序。 该方案: using System; namespace helloworld { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); returnHello(); } static string

我正在尝试在CentOS上运行一个简单的程序。

该方案:

using System;
namespace helloworld
{
    class Program
    {
         static void Main(string[] args)
         {
            Console.WriteLine("Hello World!");
            returnHello();
         }
         static string returnHello()
         {
            return "hwdy ha";
         }
     }
}
我的发布设置为:

  • 配置:释放|任何CPU
  • 目标框架:netcoreapp2.1
  • 部署模式:自包含
  • 目标运行时:linux-x64
  • 目标位置:bin\Release\netcoreapp2.1\publish\
  • 在我运行的终端中

    dotnet发布--自包含的-r linux-x64-c发行版

    然后将文件夹\publish复制到我的CentOS机器上

    使用文件helloworld,我可以看到文件详细信息:

    ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接 (使用共享库),对于GNU/linux.2.6.32, BuildID[sha1]=0x22d087f79061d441f9f6d007bf336f380c1214db,已剥离

    使用uname-r:

    3.2.0-3-amd64

    在CentOS中,我进入发布文件夹并运行:bash helloworld。作为回应,我得到了

    helloworld:无法执行二进制文件


    我不确定我在这里遗漏了什么,对我来说,似乎该文件针对的是正确的操作系统,但我无法在CentOS中执行该文件。感谢您的帮助。谢谢不要在二进制可执行文件上运行bash,直接用
    /helloworld
    运行它

    bash
    是一个shell脚本解释器,拒绝读取非文本文件。e、 g

    $ bash /bin/ls
    /bin/ls: /bin/ls: cannot execute binary file
    

    如果
    /helloworld
    不起作用,也可以尝试
    strace./helloworld
    ldd./helloworld
    来检查嵌入在可执行文件中的错误ELF解释器(动态链接器)路径。

    TLDR:您需要切换到更新的.NET Core操作系统,如CentOS 7或Debian 9

    首先,根据
    /etc/*release
    输出,您正在使用Debian wheezy(又名)。有几件事需要注意:这是在2013年发布的,生命结束于2016年。换句话说,你使用的是一个任何人都不支持的操作系统。.NET Core不支持它。Debian本身不支持它。(CentOS肯定不支持)

    其次,每个.NETCore版本都有一个它支持的平台列表(以及特定版本的平台)。这些平台的旧版本缺乏功能、兼容性,或者其他一些使.NETCore不适合在那里运行的东西

    .NET核心2.1。对于Debian,它只支持Debian 9(我假设,更高版本发布时也支持)

    由于.NET Core支持Debian 9,因此它利用了C库(
    glibc
    )中的许多功能,这些功能需要最新版本的
    glibc
    。Debian 7没有最新版本的glibc,因此无法运行.NET Core 2.1应用程序

    您应该尝试更新版本的Debian、CentOS或其他Linux发行版。我知道.NETCore2.1在RHEL(以及CentOS的扩展)上运行良好。它应该在Debian和Ubuntu的最新版本上运行良好


    有两种方法可以修改.NET Core并解决此错误,但它相当先进,会使您无法更新到新的.NET Core点版本,因此我不推荐它:您可以引导.NET Core本身(如重新编译.NET Core本身)支持Debian 7,然后使用它来运行应用程序。

    您尝试过CPU吗?是的,很抱歉我没有写。这是什么版本的CentOS?6?@OmairMajid,当我运行“uname-or”时,我得到了3.2.0-3-amd64 GNU/Linux。我不能完全确定它是否为6。请尝试
    cat/etc/*-release
    。谢谢。我尝试了./helloworld,但权限被拒绝,然后我尝试了“ldd./helloworld”,得到了“/usr/lib/x86_64-linux-gnu/libstdc++.so.6:找不到版本`GLIBCXX_3.4.18'(为./helloworld所需)”。对于“strace./helloworld”,我得到了strace:command-not-found。我查看了上面的注释,然后运行了“chmod+x helloworld”,我想我缺少了可执行权限。现在当我运行./helloworld时,我只得到了“/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`GLIBCXX_3.4.18`找不到(由./helloworld要求)”,我在go中制作了相同的helloworld程序(名为:helloworldgo),并为linux amd64构建了它。我想看看哪个版本的linux更容易构建。用./helloworldgo运行go版本运行得很好@彼得,谢谢你指出这一点。@Patrick:是的,“权限被拒绝”肯定是因为缺少
    +x
    权限
    strace
    ltrace
    是调试此类低级问题的有用工具(查看实际的系统调用进程正在进行,例如它们正在查看的路径。
    strace-e file./hello
    通常很有用)。我建议安装
    strace
    ;所有主流Linux版本都会打包它。你的库版本错误显示了一个C++库ABI版本在构建主机和你试图运行它的地方之间的不匹配。与
    libc
    不同,
    libstdc++
    在不增加
    .so.6
    到不同文件名的情况下以不兼容的方式进行更改,因此他们进行符号版本控制,以提供动态链接器错误,而不是难以调试的神秘崩溃。您好,我希望我能更新那台机器,然而不幸的是,这个建议对我来说是不可能的。不过,我非常感谢你的推荐。我工作的公司担心更新这台机器会导致遗留软件出现其他问题,因此拒绝允许这样做。我发现我可以为这台机器成功地构建Go程序,所以我有一个解决方案。再次感谢你!