我想在没有安装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
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)"你好,世界!"}int (0)
但是在web服务器上这是所有脚本返回的
array(0) {} int(11)
根据这个和这个退出代码列表,Bash退出代码11是非标准的。
两台机器都在64位Linux上,"file helloworld"返回以下内容…
在本地机器上:
helloworld: ELF 64位LSB可执行文件,x86-64,版本1 (SYSV),动态链接(使用共享库),用于GNU/Linux 2.6.24, BuildID[sha1]=fbc9731fb13202c604b025ba3eefe51c69dc40d8,未剥离
Web服务器:
helloworld: ELF 64位LSB可执行文件,x86-64,版本1 (SYSV),动态链接(使用共享库),剥离
可能"动态链接(使用共享库),剥离"仍然意味着一些嵌入式库或单运行时仍然缺失?
我创建了一个与Web服务器具有相同操作系统的虚拟机,当运行bundle时,我得到'Segmentation fault (core dumps)',其退出代码为'11'。mkbundle不是在Linux机器上部署Mono编写的软件的完全兼容的方式。
所以最后我在虚拟机上安装了Mono,编译并mkbundle了代码,在将文件上传到Web服务器后,它就能够执行了。