【问题标题】:How to write programs in C# .NET, to run them on Linux/Wine/Mono?如何在 C# .NET 中编写程序,在 Linux/Wine/Mono 上运行它们?
【发布时间】:2012-10-17 16:32:24
【问题描述】:

在这种特殊情况下,我需要为 Linux 运行 .complicated NET 应用程序。 我的意思是复杂 - 该项目已经开发了 3 年,我不想再用 java 或其他东西,开发和支持,.NET 和 Java 版本。

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

剩下的只是一堆简单的代码,没什么特别的,没有奇怪的控件,没有directx等。

我应该期待什么?这行得通吗?

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

另外我想问一下 Wine 和 .NET 的一般情况:

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

  • 哪个版本的框架? (1.x、2.0 还是我可以使用 3.5?)
  • 我应该避免什么(从 windows dll 导入?计时器?)

编辑/从评论中移动:

几年前我看过单声道,但很糟糕。现在我看到它长大了,支持 LINQ、Threading 和其他复杂的功能。另外现在帮助看起来真的很严重。我还没有接受答案,因为我看到人们仍然发布非常有用的链接。如果这个问题得到很多 +1,我会重写它,也许这会对其他人有所帮助。

我希望这里有人在这里对 .NET on linux 有一些实践经验...

【问题讨论】:

  • Mono 是 Microsoft .NET 的开源实现,您可能会使用它。
  • 谢谢。我在哪里看到过这个,但我忘记了。无论如何,我仍然需要一些在 Mono 中开发的东西的实用信息。
  • 如果担心兼容性问题,Mono Migration Analyzer 可以显示潜在问题。
  • 如果您使用 pInvokes 访问 Win32 中的功能,Mono 将不适合 - 这将在 linux 上明显失败。
  • @adrianbanks 但他在自己的问题中提到了解决方案。他可以将程序分成两部分,一个独立于平台的 .NET 部分,带有一些 IPC,另一个是根据运行平台使用的本地组件。事实上he can still use P/Invoke,他只需要对windows使用一个类,对linux使用一个类

标签: c# .net linux mono wine


【解决方案1】:

您在http://www.mono-project.com 上阅读过有关 Mono.NET 的信息吗?

它允许您编写适用于 Linux 的 .NET 应用程序,与 Microsoft 实现略有不同。 我不认为 wine 可以处理任何 .NET 组件。

只需阅读之前的文档就可以了。

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

【讨论】:

  • 谢谢。这对我来说可能已经足够了,但我等不及接受了。我看到人们仍在发布有用的链接。
  • 是的,最好的部分是它被移植得更远了,所以你也可以用它来为android和ios编写代码。
  • 如果有人遇到这个问题,现在你会想要微软的官方平台 .NET Core,它支持 Windows 和其他桌面软件上的 .NET。
【解决方案2】:

在这篇文章中,我缩短并结合了我在这个帖子中从其他人那里学到的所有信息。

  1. .NET for Linux 的开源实现称为 Mono

  2. 兼容性有据可查(请参阅下面的链接)。 Mono 支持 LINQ、线程和其他一些复杂的功能。

  3. 它甚至支持 InteropServices。可以在 linux 库上使用 DllImport (!),例如 libc.so

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

  5. 有一个 Mono 兼容性分析工具,称为 MoMA(Mono 迁移分析器)

Mono 迁移分析器 (MoMA) 工具可帮助您识别您遇到的问题 将您的 .Net 应用程序移植到 Mono 时可能会有。它有助于查明 平台特定调用 (P/Invoke) 和尚未实现的区域 Mono 项目支持。

有用的链接:

Mono - home page

Mono - page with documentation

Mono - compatibility page

MoMA - Mono Migration Analysis page

【讨论】:

【解决方案3】:

我们有几个 .net 应用程序可以在带有 Mono 的 Windows 或 Linux 上运行。

您可以根据需要在 VisualStudio 中进行开发,无需使用 Mono 开发环境。在 Linux 上运行 .net 应用程序只需要运行时单声道库。

我们使用 net 2.0 目标在 VisualStudio 中编译这些应用程序,因为 mono 与 .net 2.0 几乎 100% 兼容。 Mono 还实现了后来 .net 版本的 APIS,但不是全部,也不是那么完整。如果您使用 2.0 之后的新版本功能,您应该检查这些功能是否受支持或使用 Mono 兼容性分析工具。您也可以使用 Mono 开发而不是 Visual Studio,我的前任就是这样做的;结果几乎相同,我更喜欢使用 Visual Studio。

我们没发现什么大问题,应用比较复杂,多线程,异步 I/O,WinForms,sockets,串口等。

一些应用使用了.net 库,而MS .net 中没有这些库,但所有这些都可以安装在Windows 上,因此在Windows 中运行这些应用没有问题。

希望对你有帮助,

【讨论】:

    【解决方案4】:

    您可以使用 .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。

    【讨论】:

    • 3.0 即将到来。很快(2021 年?)就会有多平台 .NET 5。
    【解决方案5】:

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

    Wine 支持串口,所以我看不出有什么不便。

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

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

    在视频中,您可以看到 windows 任务栏。别担心。这是因为它在 WSL2 中运行。但这些步骤在 Linux 中完美运行。

    问候

    【讨论】:

    • 您认为这对于使用混合和本机 C++ 的 .NET C++/CLI winforms 应用程序是否有机会或工作?它是用 /clr 编译的。
    • 是的,它应该可以工作。 WinForms 比 WPF 得到更好的支持。你有两种方法。 1.让wine安装支持WinForms的Mono for Windows。 2.避免像视频中那样安装单声道并安装.NET框架。框架的版本取决于您在项目中指定的目标版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2023-03-23
    • 2018-05-30
    相关资源
    最近更新 更多