.NET/MONO交叉编译的最佳实践

14
什么是编写可在.NET(Windows)和Mono(Linux)上交叉编译的代码的最佳实践?虽然我非常熟悉.NET,但我并没有那么多关于Mono及其所有细节方面的经验。是否有人看到了一篇关于此的好博客文章或最佳实践文件,我没有找到呢?我将坚持使用C#3.0级功能。

首先令我担忧的是Interop,因为我需要调用一些本地代码。 接下来最好的处理名称空间(如Mono.XXX)的方法是什么? 我应该使用大量的#if吗? 将代码隔离在每个平台集成中?

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


交叉编译是错误的术语,您只需编译一次,然后在两个平台上使用它。 - trampster
我认为这不正确,因为Mono有许多Mono.*命名空间等。也许在完美的世界里? - Will I Am
我制作了一个WinForms应用程序,没有使用任何P/Invoke(听起来很容易,但很难避免P/Invoke),它在Linux上运行得非常好,与VS2010生成的相同的.exe程序集一样,并且甚至使用了最新的.NET 4功能。 - Camilo Martin
5个回答

7
最大的问题在于坚持使用Mono支持的API。在所有平台上始终针对Mono,使用Mono中的Visual Studio Integration支持可以在很大程度上帮助解决此问题。
对于您的特定问题:
1)互操作性-您需要坚持使用P/Invoke。尝试将其隔离到单独的、特定于平台的程序集中。这导致2:
2)使用#if -我建议避免使用它,而是更喜欢使用可扩展性模型。 Mono支持Managed Extensibility Framework,它为在运行时“插入”特定于平台的代码提供了一个很好的方法。

感谢您提供的可扩展性模型指针。它显示为预览版,而不是正式产品。在产品最终确定之前,.net和mono实现保持同步的机会有多大?Visual Studio集成插件肯定会有所帮助,谢谢。 - Will I Am
MEF是开源的,所以我不会太担心它。它将成为.NET 4的一部分,并且目前已经非常稳定。我们已经在我们的商业产品中使用它了。 - Reed Copsey
这是我听到的关于使用MEF进行跨平台到Mono的最佳建议。 - scope_creep

3

您应该对Prebuild感兴趣:

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


为什么要踩这个代码?Prebuid 项目非常方便,可以使用 .NET 和 Mono 平台来维护相同的代码库。而且它还是免费的。 - Larry

2

谢谢。由于这将是新代码,我不确定是否会使用此工具(除非我漏掉了什么?)。换句话说,我计划使用CI来构建Windows和Linux版本。 - Will I Am
Mono 中有一些部分尚未完成。例如,密码学中缺少一些功能。这些方法/类都用“todo”属性标记。Moma 会指出哪些未实现的功能。 - Miriam

2

The Mono项目提供了一份可移植性指南的文档。这是一个很好的起点。


值得注意的是,这份文档在某些地方似乎有点过时。但这并不意味着它缺乏有用的信息。 - Stewart

0

我们使用MonoDevelop和Visual Studio进行开发,但关键是要保留一个良好的NAnt构建脚本,以便在单个操作中构建整个项目(Joel Spolsky的规则)。

我认为主要的重点是非常清楚地说明软件必须是跨平台的,因此不是“移植到Linux / Mono”,而是在所需平台上开发每个迭代。

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

几乎一年来一直依赖于软件调试器也是一件很棒的事情。


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