在Linux系统中,掌握C#知识有什么用处吗?

我懂C#,而且喜歡在不同系統之間切換並使用Linux。我能用C#來開發可以原生運行在Linux上的應用程式嗎?我應該怎麼做才能在Linux系統中充分利用我的C#知識呢?
請注意,我專精於Unity3D,但我仍然希望使用C#來創建Linux應用程式。

1KerbalSpaceProgram是用Unity编写的,可以在Win/Mac/Linux上运行。KSP的插件/模组是用C#编写的,可以在Win、Mac或Linux上开发。由于某些原因,我现在主要使用Mac而不是Linux,但我在这个平台上用C#进行KSP模组开发,而不是Windows。我很可能很快会写一些独立的C#代码,并在KSP之外使用xUnit测试,这将与任何其他开发工作一样,只是需要在mono下运行。MechJeb有一个示例Makefile,在Mac+Linux上构建:https://github.com/MuMech/MechJeb2/blob/master/Makefile(需要链接KSP游戏dlls)。 - lamont
3C# 应用程序通常不会在任何地方以原生方式运行。 - OrangeDog
@OrangeDog 我知道,即使在Windows上也需要安装.Net框架。如果我说“本地支持”,我的意思是不需要任何仿真或兼容层。基本上,我指的是Linux是否支持它,无论您需要安装多少程序或软件包。 - Jacob
2这一切与Ubuntu有什么关联呢? - underscore_d
@underscore_d 嗯,Ubuntu 是一个 Linux 系统,我打算安装它。我担心我的 C# 知识变得无用,所以我在这里问了一下。 - Jacob
我想稍微离题地回答,你的C#经验可能会帮助你学习更多类似shell脚本的*nix特定工具。根据经验,学习一种编程语言有助于学习其他语言。 - anon
@NicHartley 是的,我对此非常了解,因为我在GML之上学习了C#,这是一种只在GameMaker工具中有用的语言。但对我来说已经足够了。如果我一次学习多种语言,那么我会对它们都掌握得不够深入。这就是为什么我想专注于一种语言并将其掌握到完美的原因。4年前我选择了C#,因为我感到受到了GML的限制,而且GML本身是基于C的语言,所以转向C#并不困难。 - Jacob
我的意思是直接相关,而不是模糊或离题的相关。这个SE网站存在的目的是为了那些特别涉及Ubuntu的问题,或者至少受到其特定属性影响而具有相关性的问题。我认为Ubuntu在C#方面没有任何特殊属性,使得这个问题符合主题。 - underscore_d
@underscore_d 哦,我明白了。我以为在创建或运行C#应用程序时必须执行一些特定于Ubuntu的步骤。看起来这里没有特定于Ubuntu的任务。就让它留在这里吧,也许有人会提出一些特定于Ubuntu的东西。 - Jacob
2@underscore_d 我不知道你从哪里听到的,但那不是真的。请参考“非仅限于Ubuntu”的问题是否适合?” Ask Ubuntu 上有很多问题同样适用于绝大多数GNU/Linux系统。也许有人会找到一个合理的理由认为这个问题不适合讨论,但如果有的话,那不是因为这个原因。(顺便说一下,这个问题确实有关于Ubuntu特定信息的答案。我自己帖子的第二段是关于Ubuntu软件包的;它也适用于一些其他发行版,但并非全部。) - Eliah Kagan
5个回答

是的,您可以在Ubuntu上开发软件,该软件本身将在Ubuntu上运行,使用C#。 Mono.NET Core都支持像Ubuntu这样的GNU/Linux系统。(您也可以在其他发行版上使用它们,例如Debian,Raspbian,Fedora,CentOS,Arch,Gentoo等。)Unity3D游戏引擎也支持Ubuntu,就像您可能知道的那样。Unity3D 嵌入Mono

在Ubuntu上有许多软件包可以通过官方社区支持的软件源使用Ubuntu的软件包管理器进行安装,这些软件包是用C#编写并使用Mono。其中包括音乐播放器Banshee,笔记应用Tomboy,光栅图形编辑器Pinta和密码管理器KeePass(自版本2起)。
大多数文本编辑器,如Gedit、Vim和Emacs,都支持C#的语法高亮显示。MonoDevelopVisual Studio Code是两个流行的集成开发环境,可以在Ubuntu上运行并支持C#开发。

11也许还可以提一下 Rider,这是一个基于 IntelliJ IDEA 的 C# 集成开发环境,包含了 ReSharper 在 Visual Studio 中的所有功能。 - Wilbert
你可能想要调整一下这个回答,以暗示其他Linux发行版的存在。因为它们也会提供或支持Mono,所以你可能希望更加中立和包容一些。 - user2066657
@user2066657 感谢您的建议,我已进行了编辑。我本意是要清楚地说明 Mono 和 .NET Core 不仅限于 Ubuntu(“类似 Ubuntu 的 GNU/Linux 系统”)。但经过进一步考虑,我意识到对于不知道我想告诉他们什么的读者来说,这可能并不清楚。因此,我扩展了那部分内容。我确实意识到这个编辑可能不能满足你:我使它更具包容性,但并没有更加中立。在该网站上强调 Ubuntu 是合理的。中间部分提供下游的 Ubuntu 包含示例 C# 程序,是有意将重点放在 Ubuntu 上的。 - Eliah Kagan
如果OP想询问非Ubuntu操作系统,他们可能会在Unix & Linux上提问。 - Mr Lister
@MrLister 是的,同意。但是我认为通过我所添加的澄清,有所得而无所失。虽然我不打算整个重新调整帖子。例如,我考虑过在帖子中说一些关于哪些发行版上安装和使用MonoDevelop和Visual Studio Code相对容易的内容,但是最终决定不这样做,因为这会使帖子变得有些复杂,并且可能改变帖子的语气和重点(以及长度!)。 - Eliah Kagan
Avalonia项目还允许您在所有桌面和移动平台上进行基于XAML的前端开发。目前,在Linux上它主要针对Gtk,但他们希望改变这一点。 - Chris Bordeman
只是提供信息,Unity现在使用的是.Net Core,而不是已经弃用的Mono。它的新DOTS平台还使用了C#功能的子集,通过数据导向的编程范式来取代垃圾回收器和类,以实现极致的性能,你必须亲眼看到才能相信。 - Chris Bordeman
现在你甚至可以使用Avalonia,一个开源的、跨平台的WPF重新实现,来编写Android/iOS/Linux/Mac/Windows应用程序。在我看来,这是一个比Xamarin更好的选择。它比WPF更高效,并且在样式系统中还有一些不错的改进,比如CSS选择器。 - Chris Bordeman


2Mono...听起来很熟悉...哦对了,这就是基于统一性的!我完全不知道我可以单独使用它。我以为它是Unity3d的一部分。 - Jacob
@Garrom 这也是Unity3d的一部分;这个游戏引擎嵌入了Mono。但你也可以编写独立运行于Mono的程序。(如果你有需要,你也可以像Unity3d一样编写自己的本地代码程序并嵌入Mono。) - Eliah Kagan
但是Mono是否与微软最新的.NET实现保持同步? - Actually a physicist
@Actuallyaphysicist 这取决于你的需求,但基本上是肯定的。新框架、C#和F#版本以及Mono支持之间通常会有一段简短的延迟。在我看来,Mono 主要缺少的是 WPF。但它也没有一些过时或高度依赖 Windows 的库。然而,请注意,供应给你的 Ubuntu 版本的 Mono 包可能没有最新的功能。所以你可能想要使用 Mono 项目的软件源。 - Eliah Kagan
43微软的最新版本实现(.Net Core)也支持Linux。 - BlueRaja - Danny Pflughoeft
6Mono实现了.NET标准2.0(如果我没记错的话),不仅仅是核心部分。 - casey
15这个答案几年前可能很好,但现在基本上已经过时了。 - Konrad Rudolph
1@KonradRudolph 过时了吗?但是.NET Core基本上需要NuGet依赖项来支持任何生产级别的程序,还是有其他替代方案吗? - somebody
据我所知,它为实际在程序中使用的软件包创建依赖关系。这与Mono/.NET Framework通常的“包含所有内容”的原则相反。 - Farhan Anam
@FarhanAnam 它还没有包括很多东西。 - somebody
2如果您正在使用最新版本的Ubuntu,请千万不要使用mono,它有很多bug和糟糕的实现,而是使用.net core。在我工作的地方,几乎每次我们在旧的Linux发行版上运行C#应用程序时遇到的问题都可以用这句话解释:“因为mono”。异常过滤器丢失堆栈跟踪,异步实现只是Task.Run的包装器,内存泄漏无处不在,而且缺乏valgrind支持,所以您甚至无法正确诊断泄漏问题。 - Lukazoid
@某人 "但是.NET Core基本上需要NuGet依赖项来支持任何生产级别的程序,不是吗?"是的,但这与它作为一个平台的可用性无关。这更像是一个特性,因为它是一个更模块化的框架...尽管时间会证明一切。 - NPSF3000
@NPSF3000 是指微软应该提供的第三方 NuGet 依赖项(我认为)。 - somebody
@某人 我没有注意到它比普通的C#更糟糕...或者你知道的,开源软件... - NPSF3000

现在你可以使用C#(.NET Core框架)在Linux上开发服务器应用程序,就像你可以使用Java或Python一样。我所指的服务器应用程序主要是指Web应用程序和Web服务(REST)应用程序。这与Linux容器(Docker/K8s)和云平台完美匹配。
你可以使用Mono Framework(一个.NET实现)和GTK#(GtkSharp)工具包(GTK的封装)来开发C#的桌面应用程序。有许多项目都是基于它开发的。过去,这个框架在Linux社区中遇到了一些抵制。一些发行版和用户不想使用Mono应用程序。
你可以使用Unity引擎在Linux上使用C#开发游戏。Unity编辑器在Linux上仍处于实验阶段。
所以,是的。如今,在Linux系统上掌握C#知识非常有用。

4你也可以使用.NET Core开发桌面应用程序。 - PmanAce
你还可以使用Avalonia,一个跨平台的WPF重新实现,来开发Mac+Linux+Windows上的移动和桌面应用程序。终于有一个非垃圾的UI工具包了! - Chris Bordeman

现在,您甚至可以使用.Net Core和一个名为Avalonia的新项目来开发基于XAML的跨平台应用程序(Linux、Mac、Windows、Android、iOS、UWP)。Avalonia目前处于Beta版本,但已经相当稳定。它类似于WPF,但具有一些类似CSS的样式增强功能。
我相信在Linux上,Avalonia目前的目标是Gtk,但他们希望转向其他解决方案。这个视频中提到了这一点,但我个人无法理解他说的内容: https://www.youtube.com/watch?v=WESJUJWBLJ0

Linux提供了C编程语言的本地API。本地Linux程序使用这些API来访问文件、I/O设备、套接字(网络)、进程间通信、线程等等。要创建本地Linux应用程序,您需要在C中编写您的应用程序,然后使用(很可能)GCC进行编译,以得到一个可执行文件。您甚至可以进一步使用GUI库在您的程序中添加GUI(GTK和Qt是两个流行的库),或者使用打包系统打包您的应用程序(如.deb和.rpm文件)。

C#、F#和VB带有自己的编译器(通常生成IL代码而不是机器代码),而不是直接使用Windows或Linux本地API(都是用C编写),它们拥有自己的封装器。这意味着需要在编译代码和操作系统之间再加入另一个额外的层。这个额外的层必须读取IL代码并将其翻译成本地的Windows、Linux或macOS API。这个额外的层可以是.NET Framework、Mono或.NET Core(目前只有.NET)。

现在来回答“C#是否适用于Linux系统编程”的问题,大多数情况下是可以的。

.NET拥有处理文件、网络、线程和一些I/O设备的库。举个例子,假设你需要在应用程序中访问蓝牙。.NET没有任何关于蓝牙的API,所以在这种情况下你有两个选择:
1. 在C中找到原生API并在C#中调用它。 2. 在NuGet中搜索是否有人已经完成了这个功能。
其他例子包括WiFi Direct、游戏手柄、CPU温度、电池信息、相机、GPS、笔记本传感器等。因此,对于低级应用程序,你需要自己解决问题(即使在Windows上也是如此,除非你选择使用UWP)。对于Linux上的这类应用程序,C或Python可能是更好的选择。
如果你想为应用程序添加图形用户界面(GUI),.NET有GUI库,但只适用于Windows。另一方面,Mono有一个名为GTK#的GTK绑定,但自然而然地,GTK#总是会落后于GTK的开发进度(除非你需要最新的功能,否则这不是一个问题)。
.NET 6还提供了跨平台GUI的另一种解决方案。在.NET 6中,你可以使用C#、HTML和CSS创建一个Blazor应用程序,并使用Electron将其转换为桌面应用程序(截至撰写本文时,该功能尚未准备好)。
总结一下:
C#在Linux上的优点:
  • 你可以利用现有的技能
  • 如果你坚持使用.NET库,你的应用程序将可在Windows和Mac上运行
  • 你正在使用一种现代、清晰的语言,而不是50年前的语言(顽固的C程序员可能会有不同意见 :D)

C# 在 Linux 上的缺点

  • 许多本地API不可用
  • 从理论上讲,本地C代码比依赖框架的C#代码更快。虽然可以直接编译为Linux,但我们会失去可移植性,而且在今天的硬件上,用户也不会感受到差异。
  • 对于GUI应用程序来说,你的手头资源更加有限

这个回答怎么能解决问题呢?我觉得没有人问过关于P/Invoke的问题。 - not my real name
1我会说不支持每个可能的操作系统API对于任何语言来说都是标准操作程序,所以不要把这个放在“缺点”里。其他方面总结得很好!还有谢谢你提到P/Invoke,因为它对于实用性来说非常重要。 - Chris Bordeman
你的手更紧是什么意思? - localhost