在 linux 终端上运行 C# 代码
Posted
技术标签:
【中文标题】在 linux 终端上运行 C# 代码【英文标题】:Run C# code on linux terminal 【发布时间】:2013-12-05 05:34:07 【问题描述】:如何在 linux 终端上将 C# 代码作为 shell 脚本执行。
我有这个示例代码:
public string Check(string _IPaddress,string _Port, int _SmsID)
ClassGlobal._client = new TcpClient(_IPaddress, Convert.ToInt32(_Port));
ClassGlobal.SMSID = _SmsID;
string _result = SendToCAS(_IPaddress, _Port, _SmsID );
if (_result != "") return (_result);
string _acoknoledgement = GetFromCAS();
return _acoknoledgement;
当我运行 shell bash 时,我使用 #!/bin/bash
。有没有 C# 做同样的事情?
【问题讨论】:
使用类似代码块的东西来编译...... 您无需编译技巧即可运行 C# 脚本。见http://***.com/questions/8371560/mono-shell-scripting 【参考方案1】:当然可以,而且过程极其简单。
我在这里解释 Ubuntu Linux 的步骤。
打开终端:
Ctrl + Alt + T
输入
gedit hello.cs
在打开的gedit
窗口中粘贴以下示例代码:
using System;
class HelloWorld
static void Main()
Console.WriteLine("Hello World!");
保存并关闭 gedit。
返回终端类型:
sudo apt update
sudo apt install mono-complete
mcs -out:hello.exe hello.cs
mono hello.exe
输出:
Hello World!
【讨论】:
【参考方案2】:注意:@adabru 下面的回答使我的解决方案过时,除非您使用的是较旧的单声道平台。
C# 脚本可以像 Python 和 Perl 脚本一样从 bash 命令行运行,但需要一点 bash 魔法才能使其工作。正如上面提到的Corey,你必须首先在你的机器上安装Mono。然后,将以下代码保存在 Linux 机器上的可执行 bash 脚本中:
if [ ! -f "$1" ]; then
dmcs_args=$1
shift
else
dmcs_args=""
fi
script=$1
shift
input_cs="$(mktemp)"
output_exe="$(mktemp)"
tail -n +2 $script > $input_cs
dmcs $dmcs_args $input_cs -out:$output_exe && mono $output_exe $@
rm -f $input_cs $output_exe
假设您将上述脚本保存为 /usr/bin/csexec,下面是一个示例 C#“脚本”:
#!/usr/bin/csexec -r:System.Windows.Forms.dll -r:System.Drawing.dll
using System;
using System.Drawing;
using System.Windows.Forms;
public class Program
public static void Main(string[] args)
Console.WriteLine("Hello Console");
Console.WriteLine("Arguments: " + string.Join(", ", args));
MessageBox.Show("Hello GUI");
将上述代码保存到“hello.cs”等文件中,使其可执行,将第一行更改为指向之前保存的 bash 脚本,然后执行它,您应该会看到以下输出以及一个对话框说“你好 GUI”:
bash-4.2$ ./hello.cs foo bar baz
Hello Console
Arguments: foo, bar, baz
请注意,GUI 要求您处于运行级别 5。这是一个在纯文本控制台上运行的更简单的 C# 脚本:
#!/usr/bin/csexec
using System;
public class Program
public static void Main(string[] args)
Console.WriteLine("Hello Console");
Console.WriteLine("Arguments: " + string.Join(", ", args));
请注意,命令行参数被传递给 C# 脚本,但 shebang 参数(在上面的第一个 C# 脚本中“-r:System.Windows.Forms.dll -r:System.Drawing.dll”)被传递到 C# 编译器。使用后一种功能,您可以在 C# 脚本的第一行指定所需的任何编译器参数。
如果您对 bash 脚本的工作原理感兴趣,shebang (#!) 将在 C# 脚本的第一行传递给它的所有参数集中在一起,然后是脚本名称,然后是传递的命令行参数到脚本本身。在上面的第一个 C# 示例中,以下 5 个参数将被传递到 bash 脚本中(用引号括起来):
"-r:System.Windows.Forms.dll -r:System.Drawing.dll" "hello.cs" "foo" "bar" "baz"
脚本确定第一个参数不是文件名,并假定它包含 C# 编译器的参数。然后它使用 'tail' 剥离 C# 脚本的第一行并将结果保存到临时文件(因为 C# 编译器不从标准输入读取)。最后,编译器的输出被保存到另一个临时文件,并使用传递给脚本的原始参数单声道执行。 'shift' 运算符用于消除编译器参数和脚本名称,只留下脚本参数。
执行 C# 脚本时,编译错误将转储到命令行。
【讨论】:
不错的脚本,虽然我建议使用 mcs 而不是 dmcs。【参考方案3】:#!
(hashbang)标签用于告诉 shell 使用哪个解释器,以便您的 perl、php、bash、sh 等脚本能够正常运行。
但 C# 不是脚本语言,它旨在编译成可执行格式。如果您想使用 C#,您至少需要安装一个编译器和运行时,最好是一个 IDE (Integrated Development Environment) 来帮助您开发和调试您的应用程序。
为编译器和运行时安装Mono,然后为IDE安装MonoDevelop。
【讨论】:
过去几年情况发生了变化。现在我们有了cs-script:csscript.net/help/CS-Script_on_Mono.html 我认为这不是解决问题的正确方法。 “你不能这样做,因为你不应该这样做”不是一个有效的答案。 iself 中的语言只是一种语言,即使 C# 不是用来编写脚本的,你也可以让它成为(可能有我们不知道的 OP 的原因),shabang 就是因为这个原因而存在的。 @MauroF。公平地说,我在大约 6 年前回答了这个问题。正确答案是下面那个。如果我能给他打勾,我会的。不幸的是,OP 没有更新正确的答案......可能已经有一段时间了。【参考方案4】:安装单声道后,您可以使用csharp hello.cs
。从 Mono 2.10 开始,您还可以像这样使用 shebang:
#!/usr/bin/csharp
Console.WriteLine ("Hello, World");
如果您需要程序集,您可以加载它们,例如在您的脚本中使用 LoadAssembly("System.IO.Compression")
行。
参考:man csharp
。
【讨论】:
【参考方案5】:你不能像脚本一样执行C#,你必须先编译它。为此,您可以安装mono。
然后您可以使用mcs
编译您的程序并使用mono
执行它。
【讨论】:
嗯,实际上 C# 本身并不是可编译或不可编译的东西,而只是一组语法规则,这一切都归结为在 Linux 下实现解释器..【参考方案6】:首先,你必须安装单声道
sudo apt install mono-complete
要执行的命令
mcs -out:$1.exe $1.cs
mono $1.exe
您可以将这些添加到脚本中以简化流程。创建一个 shell 脚本并将父目录添加到 PATH 环境变量中。 例子: 导出 PATH=$PATH":$HOME/Desktop/customcommands"
并且还赋予脚本文件执行权限。 外壳脚本:
#!/bin/sh
dpkg -s mono-complete > /dev/null
if [ $? -eq 0 ]; then
echo
else
read -p "Package mono-complete not installed. Press y to install or n to quit." response
yes="y"
if [ "$response" = "y" ];
then
sudo apt install mono-complete
echo " "
echo " "
fi
fi
mcs -out:$1.exe $1.cs
mono $1.exe
【讨论】:
以上是关于在 linux 终端上运行 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章
SQL 代码在在线编译器上运行良好,但在 Linux 终端中由 MariaDB 编译时失败(错误号:150)