我讨厌“最佳实践”这个术语,因为它似乎有些实践在任何情况下都可以是最好的,这是一件风险很高的事情,但我会告诉你我认为适用于多平台代码(以及大多数其他类型的开发)的“良好实践”:
使用持续集成引擎,并且始终为所有目标平台构建代码。
听起来太复杂了? 如果您确实需要支持多个平台,最好还是这样做。无论您对代码和库的使用多么小心,如果测试时间过晚,您将发现自己花费很长时间重新制作应用程序的大部分内容。
我实际上使用过WinForms,它运行良好。它非常丑陋,但它能正常工作。
显然不要使用P / Invoke或任何win32之类的注册表。还要注意任何第三方DLL。例如,我们使用第三方SQLite DLL,其中实际上包含本机代码,如果我们想在OSX / Linux上运行,则必须替换它。
注意与文件名和路径操作相关的任何内容,并使用可移植的.NET方法,例如 System.IO.Path
而不是:
string myfile = somepath + "\\file.txt";
做:
string myfile = Path.Combine(somepath, "file.txt");
如果您需要指定路径分隔符,您可以使用 Path.Separator 等。不要使用"\r\n"作为换行符,应该使用Environment.NewLine
请记住:
L.E.:似乎一些较新的 MacOS 不再使用 "\r" 作为换行符。
不要使用Windows.Forms来创建GUI,但Mono可能已经提到了这一点。Gtk#对于跨平台GUI更加一致和可靠。
几年前,我会建议您购买我关于跨平台.NET的书籍book,但由于该书现在有些过时了,您真正需要依靠Mono网站的信息。
Mono迁移分析器(MoMA)工具非常适合分析现有的.NET应用程序,并警告您可能存在的可移植性问题,但对于新代码来说,最好使用最新稳定版本的Mono进行开发。
正如Orion所说,当使用第三方DLL时,您需要小心,尽管我的合著者编写了一个NativeProbe工具,可以分析DLL的P / Invoke依赖项,如果您确实想快速检查第三方软件。
如果您决定在MS .NET上开发,则应尝试确保您还在Mono上构建和单元测试,并注意一些特定于Windows的命名空间,例如Microsoft.Win32和System.Management命名空间。
如果您想要代码具有可移植性,您需要仔细查看 Mono 网站上已完成特性列表。该列表对框架中的每个类进行详细说明,并列出了其完整度级别。在设计过程中,您需要考虑这些事项,以免走得太远并发现某个关键功能尚未实现。