0

我想在没有安装 Mono Runtime 的 Web 服务器上运行 Mono(C#) 代码。由于 mkbundle 能够生成本机代码,我首先尝试让一个普通的“Hello World”脚本在双方都工作,它在本地运行但不在 Web 服务器上运行。

C# HelloWorld.cs 脚本:

 using System;

 public class HelloWorld
 {
    public static void Main()
    {
       System.Console.WriteLine("Hello, World!");
    }
 }

我使用以下代码进行编译和捆绑: $ gmcs HelloWorld.cs -out:HelloWorld.exe
$ mkbundle -o helloworld HelloWorld.exe --static --deps

我唯一允许在 Web 服务器上执行此脚本的方法是使用 PHP 脚本,该脚本具有以下内容:

 $cmd = "./helloworld";
 exec($cmd, $array, $return_code);
 var_dump($array);
 //passthru($cmd, $return_code);
 var_dump($return_code);

在本地,此脚本有效,我得到以下响应:

数组(1){ [0]=> 字符串(13)“你好,世界!” } 整数(0)

但在 Web 服务器上,这就是脚本返回的所有内容

数组(0){}整数(11)

根据这个这个退出代码列表,Bash 退出代码 11 是非标准的。

两台机器都在 64 位 Linux 上,“文件 helloworld”返回以下内容......
在本地机器上:

helloworld:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.24,BuildID[sha1]=fbc9731fb13202c604b025ba3eefe51c69dc40d8,未剥离

在网络服务器上:

helloworld:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),剥离

可能“动态链接(使用共享库),剥离”仍然意味着仍然缺少一些嵌入式库或单声道运行时?

4

1 回答 1

0

我创建了一个与 Web 服务器具有相同操作系统的虚拟机,在运行捆绑包时出现“分段错误(核心转储)”,其退出代码为“11”。mkbundle 不是在 Linux 机器上部署 Mono 编写的软件的完全兼容方式。

所以最后我在虚拟机上安装了Mono,编译并mkbundle'd代码,并将文件上传到Web服务器后它能够执行它。

于 2014-06-08T09:33:58.737 回答