20

我正在寻找为 linux/windows/mac/任何其他平台编写一些 C# 代码,并且正在寻找可移植代码的最佳实践。

Project mono有一些很好的移植资源。

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

4

9 回答 9

15

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

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

听起来太复杂了?好吧,如果你真的需要支持多个平台,最好这样做。无论您对代码和库的使用多么小心,如果您测试得太晚,您会发现自己要花费大量时间来修改应用程序的大部分内容。

于 2008-09-03T22:25:13.767 回答
14

我实际上使用过winforms,这很好。这很糟糕,但它奏效了。

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

于 2008-09-03T21:48:56.727 回答
11

注意与文件名和路径操作有关的任何事情,并利用System.IO.Path中的可移植 .NET 方法,即。

代替:

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

做:

string myfile = Path.Combine(somepath, "file.txt");

如果您需要指定路径分隔符,那么您将使用Path.Separator

于 2008-09-11T07:30:55.923 回答
10

不要使用 "\r\n" 换行。使用Environment.NewLine

记住 :

  • *NIX 仅使用换行符 ("\n")
  • Windows 使用“\r\n”
  • MacIntosh 使用“\r”(我对此不太确定 - 请随时纠正我)。

LE:似乎一些较新的 MacOS 不再使用“\r”行分隔符了。

于 2008-10-04T13:19:55.873 回答
6

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

于 2008-09-03T21:28:45.247 回答
3

几年前,我会建议你给自己买一本我关于跨平台 .NET 的,但由于这本书有点过时了,现在你真的需要坚持使用 Mono 站点的信息。

Mono Migration Analyzer (MoMA)工具非常适合分析现有的 .NET 应用程序并警告您存在可移植性问题,但新代码的最佳选择是使用 Mono 的最新稳定版本进行开发工作。

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

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

于 2008-09-03T22:32:34.513 回答
1

如果您希望代码可移植,则需要仔细查看 Mono 站点上已完成功能的列表。他们详细介绍了框架中的每个类以及完整性级别。在设计过程中,您必须考虑这些事情,这样您就不会走得太远而发现尚未实现关键功能。

于 2008-09-03T21:31:20.293 回答
1

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

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

此外,不要假设编译器的工作方式完全相同。我们最近发现了一个问题,即 MS C# 编译器似乎包含 Mono 不包含的内容,需要在我们的构建脚本中进行额外引用。

除此之外,它非常简单。我记得我们第一次在 Mono/Linux 上运行 GUI——那非常令人兴奋的(即使它很丑)

于 2008-09-03T23:00:47.210 回答
1

缺少一项:确保文件名区分大小写。File.Open("MyFile.txt"); 如果您的文件名为 myfile.txt,则无法在 Unix 上运行。

于 2008-11-15T03:33:22.217 回答