如何在Linux/Wine/Mono上编写C# .NET程序并运行?

21
在这种情况下,我需要在Linux上运行一个复杂的.NET应用程序。所谓复杂是指该项目已经开发了3年,我不想再用Java或其他语言重新编写它,并开发和支持两个版本,即.NET和Java版本。

该应用程序通过WinAPI / DLL导入来生成鼠标和键盘事件,并使用串行端口。我还有几个计时器用于延迟-用于串行端口通信(10-20ms,在这里我不需要很高的精度)。

其余的只是很多简单的代码,没有特别的控件,没有DirectX等。

我应该期望什么? 这会有效吗?

如果代码的某些部分失败-我可以稍微改变它,将.NET应用程序和我可以编写用于发送鼠标和键盘事件或RS232通信的迷你应用程序之间的网络连接。

此外,我想问问Wine和.NET:

如何编写应该在Linux / Wine / Mono上运行的.NET应用程序?

  • 框架的哪个版本? (1.x、2.0或者我可以使用3.5?)
  • 应该避免什么(从Windows DLL导入?定时器?)

编辑/从评论中移动:

我几年前看到了Mono,但它很糟糕。现在我看到它已经成长起来了,支持LINQ、Threading和其他复杂的特性。此外,现在的帮助看起来非常认真。我还没有接受答案,因为我看到人们仍然发布非常有用的链接。如果这个问题得到了许多+1,我会重写它,也许这会帮助其他人。

我希望在这里有一些关于.NET在Linux上的实际经验......


1
Mono是微软.NET的开源实现,你可以在这方面使用它。 - Anirudh Ramanathan
谢谢。我在某个地方看到过这个,但是我忘了。无论如何,我仍然需要一些实际信息,来自于开发了在Mono中运行的东西的人。 - Kamil
1
如果您担心兼容性问题,可以使用Mono迁移分析器来显示潜在的问题。 - Anirudh Ramanathan
2
如果您正在使用pInvokes来访问Win32中的功能,则Mono将不适用 - 这将在Linux上失败。 - adrianbanks
3
@adrianbanks在自己的问题中提到了解决方案。他可以将程序分成两部分,一部分是与平台无关的.NET部分,并通过IPC与本地组件进行通信,根据运行平台使用相应的本地组件。事实上,他仍然可以使用P/Invoke,只需要为Windows和Linux各使用一个类即可。 - Scott Chamberlain
5个回答

21

你有没有看过http://www.mono-project.com上的Mono.NET?

它允许你编写针对Linux的.NET应用程序,与Microsoft实现相比有一些小差异。我认为Wine无法处理任何.NET组件。

只需先阅读文档,然后就可以开始使用了。

PS:这还为您提供了mono和.NET之间的兼容性列表。 http://www.mono-project.com/CompatibilityMoMA(mono迁移分析器)是一种工具,可以扫描已创建的任何.NET应用程序,以查看其是否兼容部署在Linux上。


1
谢谢。这对我来说可能已经足够了,但我会等待接受。我看到人们仍在发布有用的链接。 - Kamil
1
是的,最好的部分是它甚至被移植得更远,因此您也可以使用它编写Android和iOS的代码。 - Freeman
如果有人看到这个问题,现在你需要使用.NET Core,这是微软官方支持在Windows和其他桌面软件上运行.NET的平台。 - person27

7
在本文中,我将结合其他人在这个帖子中的所有信息进行概述。
  1. Linux上的.NET的开源实现被称为Mono

  2. 兼容性得到了很好的记录(参见下面的链接)。Mono支持LINQ、线程和一些其他复杂的特性。

  3. 它甚至支持InteropServices。甚至可以使用DllImport来调用Linux库,例如libc.so

  4. Mono可以支持Android和iOS(它们是基于Linux的,对吧?)

  5. 有一个名为MoMA(Mono Migration Analyzer)的Mono兼容性分析工具

Mono Migration Analyzer (MoMA)工具可帮助您识别在将.Net应用程序移植到Mono时可能遇到的问题。它可以帮助确定平台特定的调用(P/Invoke)和未被Mono项目支持的区域。

有用的链接:

Mono - 主页

Mono - 文档页面

Mono - 兼容性页面

MoMA - Mono迁移分析页面


八年后,您可以安装.NET Core SDK https://snapcraft.io/dotnet-sdk :) - lofidevops

3
我们有几个.NET应用程序可以在Windows或Linux上使用Mono运行。您可以选择在VisualStudio中开发,但不必使用Mono开发环境。只需要安装运行时的Mono库即可在Linux上运行.NET应用程序。
我们使用.NET 2.0目标在VisualStudio中编译这些应用程序,因为Mono与.NET 2.0几乎完全兼容。Mono还实现了来自较新.NET版本的API,但不是全部且不完整。如果您使用比2.0更新版本的功能,请检查这些是否受支持或使用Mono兼容性分析工具。您也可以使用Mono Develop代替Visual Studio进行开发;结果几乎相同,但我更喜欢使用Visual Studio。
我们没有遇到任何重大问题,应用程序相对复杂,采用了多线程、异步I/O、WinForms、套接字、串口等技术。
有些应用程序使用了MS .NET中不可用的.NET库,但所有这些都可以在Windows上安装,因此在Windows上运行这些应用程序没有问题。
希望这有所帮助,

2

您可以使用.NET Core在Linux上开发C#应用程序:https://www.microsoft.com/net/core

安装完成后,在终端中输入dotnet new,即可获取可生成的应用程序模板列表,供您开始使用。

截至今天的.NET Core 2.0版本,这是列表:

Templates                                         Short Name       Language          Tags               
--------------------------------------------------------------------------------------------------------
Console Application                               console          [C#], F#, VB      Common/Console     
Class library                                     classlib         [C#], F#, VB      Common/Library     
Unit Test Project                                 mstest           [C#], F#, VB      Test/MSTest        
xUnit Test Project                                xunit            [C#], F#, VB      Test/xUnit         
ASP.NET Core Empty                                web              [C#], F#          Web/Empty          
ASP.NET Core Web App (Model-View-Controller)      mvc              [C#], F#          Web/MVC            
ASP.NET Core Web App                              razor            [C#]              Web/MVC/Razor Pages
ASP.NET Core with Angular                         angular          [C#]              Web/MVC/SPA        
ASP.NET Core with React.js                        react            [C#]              Web/MVC/SPA        
ASP.NET Core with React.js and Redux              reactredux       [C#]              Web/MVC/SPA        
ASP.NET Core Web API                              webapi           [C#], F#          Web/WebAPI         
global.json file                                  globaljson                         Config             
Nuget Config                                      nugetconfig                        Config             
Web Config                                        webconfig                          Config             
Solution File                                     sln                                Solution           
Razor Page                                        page                               Web/ASP.NET        
MVC ViewImports                                   viewimports                        Web/ASP.NET        
MVC ViewStart                                     viewstart                          Web/ASP.NET        

当前最新版本为2.0。

1
3.0 即将到来。很快就会有多平台的 .NET 5(2021年?)。 - Kamil

0

您可以使用winetricks在wine中安装完整的.Net Framework 4.x,然后运行您的应用程序。

Wine支持串口,所以我不认为会有任何不便。

我制作了一个视频展示这个过程:

https://www.youtube.com/watch?v=60yyWBLXv1k

在视频中,您可以看到Windows任务栏。不用担心,这是因为它正在WSL2上运行。但是这些步骤在Linux上可以完美地工作。
敬礼

你认为这个方法对于使用混合和本地C++的.NET C++/CLI WinForms应用有机会奏效吗?它是使用/clr编译的。 - Adam Bruss
是的,它应该可以工作。WinForms比WPF得到更好的支持。有两种方法。1.让Wine安装支持WinForms的Windows Mono。2.避免像视频中一样安装mono,而是安装.NET框架。框架的版本取决于您在项目中指定的目标版本。 - Carlos Rafael Ramirez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接