如何在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#做同样的事情?
答案 0 :(得分:25)
C#脚本可以像bash命令行一样运行,就像Python和Perl脚本一样,但它需要一些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脚本,然后执行它,您应该看到以下内容输出以及" Hello 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&# 34;)被传递给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#编译器不从stdin读取)。最后,编译器的输出将保存到另一个临时文件中,并以单声道执行,并将原始参数传递给脚本。转移' operator用于消除编译器参数和脚本名称,只留下脚本参数。
执行C#脚本时,编译错误将被转储到命令行。
答案 1 :(得分:21)
当然可以做到,而且过程非常简单。
我在这里解释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 :(得分:12)
#!
(hashbang)标记用于告诉shell使用哪个解释器,以便你的perl,php,bash,sh等脚本运行正确。
但是C#不是脚本语言,它旨在编译成可执行格式。如果要使用C#,则需要至少安装编译器和运行时,最好是IDE(Integrated Development Environment)来帮助您开发和调试应用程序。
为编译器和运行时安装Mono,然后为IDE安装MonoDevelop。
答案 3 :(得分:4)
你不能像脚本那样执行C#,你必须先编译它。为此,您可以安装mono。
然后,您可以使用mcs
编译您的程序,并使用mono
执行该程序。
答案 4 :(得分:0)
安装Mono后,您可以使用csharp hello.cs
。从Mono 2.10开始,您还可以像下面这样使用shebang:
#!/usr/bin/csharp
Console.WriteLine ("Hello, World");
如果需要程序集,则可以加载它们,例如在脚本中的LoadAssembly("System.IO.Compression")
行。
参考:man csharp
。