C#便携式程序的最佳实践

20

我希望编写一些适用于Linux/Windows/Mac等其他平台的C#代码,并寻找可移植性最佳实践。

项目mono提供了一些很好的移植资源。

C#可移植性的最佳实践是什么?

9个回答

15

我讨厌“最佳实践”这个术语,因为它似乎有些实践在任何情况下都可以是最好的,这是一件风险很高的事情,但我会告诉你我认为适用于多平台代码(以及大多数其他类型的开发)的“良好实践”:

使用持续集成引擎,并且始终为所有目标平台构建代码

听起来太复杂了? 如果您确实需要支持多个平台,最好还是这样做。无论您对代码和库的使用多么小心,如果测试时间过晚,您将发现自己花费很长时间重新制作应用程序的大部分内容。


14

我实际上使用过WinForms,它运行良好。它非常丑陋,但它能正常工作。

显然不要使用P / Invoke或任何win32之类的注册表。还要注意任何第三方DLL。例如,我们使用第三方SQLite DLL,其中实际上包含本机代码,如果我们想在OSX / Linux上运行,则必须替换它。


2
Gendarme和MoMA也可以提供帮助。 - user7116

11

注意与文件名和路径操作相关的任何内容,并使用可移植的.NET方法,例如 System.IO.Path

而不是:

string myfile = somepath + "\\file.txt";

做:

string myfile = Path.Combine(somepath, "file.txt");
如果您需要指定路径分隔符,您可以使用 Path.Separator 等。

10

不要使用"\r\n"作为换行符,应该使用Environment.NewLine

请记住:

  • *NIX使用单个换行符("\n")
  • Windows使用"\r\n"
  • Macintosh使用"\r"(我不是很确定,如果有错误请指正)。

L.E.:似乎一些较新的 MacOS 不再使用 "\r" 作为换行符。


Macintosh以前使用\r,如今由于其BSD基础,使用\n。不确定确切的更改时间。虽然仍可能存在问题。 - Matthew Scharley

6

不要使用Windows.Forms来创建GUI,但Mono可能已经提到了这一点。Gtk#对于跨平台GUI更加一致和可靠。


3

几年前,我会建议您购买我关于跨平台.NET的书籍book,但由于该书现在有些过时了,您真正需要依靠Mono网站的信息。

Mono迁移分析器(MoMA)工具非常适合分析现有的.NET应用程序,并警告您可能存在的可移植性问题,但对于新代码来说,最好使用最新稳定版本的Mono进行开发。

正如Orion所说,当使用第三方DLL时,您需要小心,尽管我的合著者编写了一个NativeProbe工具,可以分析DLL的P / Invoke依赖项,如果您确实想快速检查第三方软件。

如果您决定在MS .NET上开发,则应尝试确保您还在Mono上构建和单元测试,并注意一些特定于Windows的命名空间,例如Microsoft.Win32和System.Management命名空间。


1
一个遗漏的细节:确保文件名区分大小写。如果你的文件名为myfile.txt,那么File.Open("MyFile.txt")在Unix上将无法工作。

1

如果您想要代码具有可移植性,您需要仔细查看 Mono 网站上已完成特性列表。该列表对框架中的每个类进行详细说明,并列出了其完整度级别。在设计过程中,您需要考虑这些事项,以免走得太远并发现某个关键功能尚未实现。


1

还有一些其他简单的事情。比如不要假设路径字符。或者换行符

我是那些经常在Linux或OSX上使用Mono编译NUnit的人之一。

此外,不要假设编译器完全相同。最近我们发现了一个问题,微软的C#编译器似乎包含了Mono没有的东西,需要在我们的构建脚本中添加额外的引用。

除此之外,一切都很顺利。我记得第一次在Mono/Linux上运行GUI时非常激动(即使它看起来很丑)。


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