【问题标题】:Best practices for .NET/MONO cross compiling.NET/MONO 交叉编译的最佳实践
【发布时间】:2010-12-20 01:32:54
【问题描述】:

编写可在 .NET(Windows)和 Mono(Linux)上交叉编译的代码的最佳实践是什么?尽管我对 .NET 非常熟悉,但我对 Mono 及其所有问题的经验并不丰富。有没有人看过一篇关于这方面的好博客文章或最佳实践论文,但我无法挖掘出来?我会坚持使用 C# 3.0 级别的功能。

我首先关心的是互操作,因为我需要调用一些本机代码。 接下来是处理诸如 Mono.XXX 之类的命名空间的最佳方法。我应该使用一堆#if吗?隔离每个平台程序集中的代码?

任何有关架构和设计的建议将不胜感激! 如果您有在 Visual Studio(任何版本)中为 Linux/Mono 进行交叉编译的经验,我也会对此感兴趣。

【问题讨论】:

  • 交叉编译是错误的说法,你编译一次,然后在两个平台上使用。
  • 我不认为这是正确的,因为 Mono 有许多 Mono.* 命名空间等。也许在一个完美的世界里?
  • 好吧,我制作了一个没有任何 P/Invoke 的 WinForms 应用程序(听起来很简单,但很难避免 P/Invoke),它在 Linux 上运行得非常好,与 VS2010 生成的相同的 .exe 程序集,它甚至使用了全新的 .NET 4 功能。

标签: .net mono


【解决方案1】:

最大的问题是坚持使用 Mono 支持的 API。在 Mono 中使用 Visual Studio Integration 支持对此有很大帮助,因为您可以在所有平台上始终以 Mono 为目标。

对于您的具体问题:

1) 互操作 - 您需要坚持使用 P/Invoke。尝试将其隔离为单独的、特定于平台的程序集。这导致 2:

2) 使用#if - 我会避免这种情况,并且更喜欢使用可扩展性模型。 Mono 支持Managed Extensibility Framework,它提供了一种在运行时“插入”平台特定代码的好方法。

【讨论】:

  • 感谢指向可扩展性模型的指针。它显示它是预览版,而不是发货产品。在产品最终确定之前,.net 和 mono 实现保持同步的可能性有多大? Visual Studio 集成插件肯定会有所帮助,谢谢。
  • MEF 是开源的,所以我不会太担心。它将成为 .NET 4 的一部分,并且在这一点上非常稳定。我们已经在我们的商业产品中使用了它。
  • 这是我听过的关于 MEF 用于跨平台到 Mono 的最佳建议。
【解决方案2】:

你应该对Prebuild 感兴趣:

Prebuild 是一个跨平台的 XML 驱动的预构建工具,它允许开发人员轻松地为主要的 IDE 和 .NET 开发工具生成项目文件,包括:Visual Studio .NET 2002、2003、2005、SharpDevelop、MonoDevelop 、NAnt 和 Autotools。

【讨论】:

  • 为什么投反对票? Prebuid 项目非常便于使用 .NET 和 Mono 平台维护相同的代码库。而且它是免费的。
【解决方案3】:

【讨论】:

  • 谢谢。由于这将是新代码,因此我不确定是否会使用此工具(除非我遗漏了什么?)。换句话说,我打算使用 CI 来构建 linux 构建的两个窗口。
  • Mono 的某些部分没有完成。例如,密码学中很少有东西丢失。这些方法/类标有“待办事项”属性。 Moma 会指出那些没有实现的东西给你。
【解决方案4】:

Mono 项目提供了一个带有portability guidelines 的文档。这是一个很好的起点。

【讨论】:

  • 如果值得注意的是,该文档在某些地方似乎有些过时。这并不意味着它没有充满有用的信息。
【解决方案5】:

我们使用 MonoDevelop 和 Visual Studio 进行开发,但关键是要保留一个好的 NAnt 构建脚本,以便一次性构建整个东西(Joel Spolsky 的规则)。

IMO 的主要观点是非常明确地声明该软件必须是跨平台的,因此不是“移植到 linux/mono”,而是实际在所需平台上开发每个迭代。

一开始我们不得不避免一些特性(现在使用 Mono/.NET 5 年作为商业产品),我们仍然坚持使用 .NET Remoting,但在我看来,这在多平台开发中并不是什么大问题.

在将近一年的时间里依靠软调试器也是一件好事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多