在 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)

Linux的终端怎么运行C语言

M1芯片成功运行Linux,终端一行代码启动安装,也能一键删除卸载

如何在linux终端上一行编译运行?

如何在 linux 终端中同时编译和运行 c++ 代码?

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?