在Ubuntu终端中,我该如何编译、运行和反编译C#代码?

我有一段C#代码,我需要使用终端进行编译、执行和反编译。

我该如何做?


我认为在Linux上安装VS Code然后用C#编码会更容易,这里有详细的步骤说明:https://qawithexperts.com/article/c-sharp/hello-world-visual-studio-code-c-example/307 - Vikas Lalwani
4个回答

如果您想运行来自Mono或Microsoft .NET的软件,而这些软件不是从Debian软件包安装的话,您需要安装mono-complete
  1. 安装 mono-complete。在所有当前支持的Ubuntu版本中,打开终端并输入:

    sudo apt install mono-complete
    
  2. 将您的C#代码保存在一个名为hello.cs的文件中。示例hello.cs代码如下:

    using System;
    
    namespace Project_1 {
        class MainClass {
            public static void Main (string[] args) {
                Console.WriteLine ("Hello World!");
                Console.ReadKey ();
            }
        }
    }
    
  3. 使hello.cs可执行。右键单击hello.cs文件 -> 选择属性 -> 权限选项卡 -> 在允许作为程序执行文件左侧勾选。

  4. 使用cd命令切换到包含hello.cs文件的目录。

  5. 使用mcs编译器从源文件hello.cs创建一个名为hello.exe的Windows可执行文件。

    mcs -out:hello.exe hello.cs
    
  6. 使用mono运行hello.exe程序。

    mono hello.exe
    
  7. 第6步运行程序的结果应为:

    Hello World!  
    
  8. Enter返回到默认终端提示符。

  9. 反编译可执行文件。

    monodis --output=decompiled-hello.txt hello.exe
    

我认为你不需要执行第八步 - Sonevol
1但是我也进行了测试,我并不需要第8步。哦,好的,对不起,我忘记加上Console.ReadKey(); - Sonevol
抱歉我没有在第二步中包含我使用的示例hello.cs代码,我已经编辑了我的答案并加入了。 - karel
为什么在2018年还要使用Mono,而官方的.NET Core自2016年起就已经适用于Linux了呢? - phuclv

你可以使用跨平台支持且开源的C#实现mono
打开终端并安装mono:

对于Ubuntu 20.04 (稳定版)

sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update

对于Ubuntu 18.04

sudo apt install apt-transport-https dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu vs-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-vs.list
sudo apt update

对于Ubuntu 16.04

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
sudo apt install apt-transport-https
echo "deb https://download.mono-project.com/repo/ubuntu vs-xenial main" | sudo tee /etc/apt/sources.list.d/mono-official-vs.list
sudo apt update

对于Ubuntu 14.04

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
sudo apt install apt-transport-https
echo "deb https://download.mono-project.com/repo/ubuntu vs-trusty main" | sudo tee /etc/apt/sources.list.d/mono-official-vs.list
sudo apt update

然后输入
sudo apt install mono-complete

在当前目录中创建一个示例的C#文件。
例如,您可以使用以下代码:
class GoodDay
{
    public static void Main()
    {
        System.Console.WriteLine("Good Day!");
    }
}

使用任何文本编辑器,如gedit,输入以下代码并将文件保存为GoodDay.cs 编译代码的命令 -
mcs -out:GoodDay.exe GoodDay.cs

生成了一个可执行文件 GoodDay.exe
执行 .exe 文件的命令 -
mono GoodDay.exe

输出将是 -
Good Day!

反编译可执行文件的命令 -
monodis --output=GoodDay.txt GoodDay.exe

反编译的代码信息保存在新生成的文件GoodDay.txt中。

微软的官方.NET Core自2016年以来一直存在。它是开源软件,支持许多平台。甚至Mono现在与.NET Core共享一些代码,所以在2018年几乎没有理由使用Mono。
只需访问官方网站进行下载和安装。如果您想要通过命令行安装,请访问在Linux上安装.NET,具体来说是在Ubuntu上安装.NET SDK或.NET Runtime。要使用apt安装SDK和运行时,请执行以下操作。
sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

您还可以使用Snap进行安装{{link1:安装}}

sudo snap install dotnet-sdk --classic --channel=5.0

截至2021年,真正的开源解决方案仍然是Mono,可以在他们的网站https://www.mono-project.com/上找到。毫不奇怪,微软的实现在Linux上效果不佳(慢、无响应)。这是可以预料的,因为微软长期以来一直是Linux及其自由、开源本质的敌对势力。坚持使用Mono,它仍在不断开发,并且容易安装。请在链接中下载说明。

因为我在这个页面上发布了最受赞同的回答,所以我尝试了各种不同的.NET Core版本作为Mono的替代方案,但在Ubuntu系统上,我仍然无法使其正常工作。 - karel