【问题标题】:should i use mono to develop linux app我应该使用 mono 来开发 linux 应用吗
【发布时间】:2013-08-29 12:04:16
【问题描述】:

我有多年的微软开发堆栈开发经验,主要是 Visual Studio 2012/c#。但是现在,我需要在 linux 上开发应用程序。虽然我知道 c++,但自从我真正接触到它已经有好几年了。我有几个问题。

  1. 我可以使用单声道开发并编译适用于 linux 和 windows 的二进制文件,而无需更改任何代码(或最少的代码更改)吗?
  2. 我可以在windows平台上使用visual studio 2012进行开发,在window平台上为linux编译吗? windows平台的linux编译需要使用虚拟机吗?
  3. 如果你想在windows平台上开发linux应用程序,你如何设置你的开发环境(在windows上开发,为linux和windows编译。我用于测试的linux盒子是一台单独的机器。)

关于我正在做什么的一些信息。 我的项目是关于网络渠道分析的。客户端很可能是没有 ui 的廉价工业 Linux 盒子。我使用 mono/c# 来开发客户端。服务器将是使用 vs2012 c# 开发的 windows。最有可能使用 wpf 作为 ui。我计划在 linux(client) 和 windows(server) 之间共享网络/通信库。我对使用 linux 的主要关注是节省成本,因为客户端几乎是一千个单位。

谢谢。

【问题讨论】:

  • 我不打算开发一个 linux 桌面应用程序(我把它当作带有 gui 的应用程序)。我计划在 linux 中开发一个控制台应用程序,因为我已经知道 c#。
  • 那么您将不会遇到答案解释的有关 WinForms、WPF 等的大部分障碍,只需使用 VS2012 开发您的应用程序而不使用 P/Invokes,它就可以在 Linux 上运行

标签: c# visual-studio-2012 mono


【解决方案1】:

Mono 以 PE(Portable Executable)格式运行可执行文件,这是 Windows 的原生文件格式。只要您的应用程序是纯 MSIL,就无需“为 Linux 编译”。即使您通过 p/invoke 使用本机 DLL,Mono 和 Wine 也可以协同工作以在 Linux 上运行 Windows 文件。

(本地 Linux 应用程序使用的 a.out 和 ELF 可执行格式没有存储 .NET 元数据的机制,PE 格式被修改为支持 .NET,所以这就是 .NET Framework(不是 Micro Framework)的实现方式不分平台使用)

【讨论】:

  • 更多关于 Mono+Wine 的信息可以在wiki.winehq.org/Mono 找到,但恕我直言,这不是一个好主意。
【解决方案2】:

一开始要考虑的最重要的事情是,

  • Mono 的 WinForms 存在问题。不仅大多数第三方控件无法正常工作,而且 libgdiplus 本身也不是 100% 兼容微软的 GDI+。这似乎是一个不错的选择,但稍后您可能仍需要努力解决不兼容问题。
  • WPF 不是一个选项,因为 Mono 还不支持它。
  • GTK# 是 UI 的最佳选择,它与 Linux 发行版自然融合。如果你正确地重构你的 Windows 项目,你应该能够在你的 Windows 和 Linux 解决方案之间共享非 UI 代码。这是 Mono 人推荐的(不仅使用适用于 Windows、Linux 的原生 UI 框架,还适用于 Mac/MonoMac、iOS/Xamarin.iOS 和 Android/Xamarin.Android)。

所以回到你的问题,

  1. 您不应该希望真实世界的项目没有代码更改。不,那是不可能的。正如我之前所说,您有机会分享大部分非 UI 部分。
  2. 您可以使用 VS2012 开发非 UI 部分和仅 Windows 部分并在 Windows 上进行测试。如果您打算使用 Mono 的 WinForms 或 GTK#,则必须使用 MonoDevelop 在 Linux 上进行开发和调试。因此,您需要 Linux 的虚拟机或物理机。
  3. 对我来说,我经常在 Linux/MonoDevelop 和 Windows/VS 之间切换。

由于 Mono + C# 比使用 C/C++ 更高效,许多成功的 Linux 应用程序都是在 Mono 上开发的,例如 Banshee 和 Tomboy。

【讨论】:

  • 感谢您的宝贵见解。我的项目是关于网络渠道分析的。客户端很可能是没有 ui 的廉价工业 Linux 盒子。我使用 mono/c# 来开发客户端。服务器将是使用 vs2012 c# 开发的 windows。最有可能使用 wpf 作为 ui。我计划在 linux(客户端)和 windows(服务器)之间共享网络/通信库。我对使用 linux 的主要关注是节省成本,因为客户端几乎是一千个单位。您对此事有何看法?如果你是我,你会怎么做?谢谢。
  • 如果你的Linux应用是简单的控制台应用(Linux服务应用通常也是基于控制台的,不同于Windows服务应用),那么我认为你可以充分利用VS来编写它,然后在 Linux 上进行测试。但是,由于 Mono CLR 和 .NET CLR 的不同,有时您可能还需要准备一台 Linux 开发机(虚拟/物理),以防您需要执行一些仅 Mono 的调试。
  • 为什么不做网页界面呢?现在你可以让它变得非常丰富,而且它会非常跨平台。
  • 基于 Web 的 UI 性能受到您包装的 Web 浏览器核心的限制。如果你真的想开发复杂的 UI,原生控件/DirectX/OpenGL 可以给你更好的结果。
【解决方案3】:

您可以毫无问题地使用 Visual Studio,但例如您不能使用 WPF,而 Windows 窗体则可以。有关您可以使用的更多信息,请访问:http://www.mono-project.com/Compatibility

此外还有与VS集成的Mono工具:http://www.mono-project.com/GettingStartedWithMonoTools

【讨论】:

  • Windows 窗体似乎是一种选择,但通常不建议将其用于应用程序迁移,因为 .NET WinForms 和 Mono 的实现之间存在许多不兼容性。顺便说一句,VS 的 Mono Tools 不再公开可用。您所指的页面上的链接实际上链接到 Xamarin 的 iOS 和 Android 产品。
  • @LexLi 所以现在唯一的选择是 MonoDevelop?
  • 我宁愿说“如果你想为 GTK# 设计 UI 并调试到 Mono”,唯一的选择是 MonoDevelop。这些是你不能用 VS 做的事情,但在 VS 中你可以编写非 UI 代码。
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多