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

项目 单核细胞增多症 有一些很棒的 移植 资源。

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

有帮助吗?

解决方案

我实际上用过winform,效果很好。虽然很丑,但确实有效。

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

其他提示

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

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

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

注意与文件名和路径操作有关的任何事情,并在以下位置使用可移植的 .NET 方法: 系统.IO.路径 IE。

代替:

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

做:

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

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

不要使用“ ”作为新行。使用 环境.NewLine

记住 :

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

L.E.:似乎一些较新的 MacOS 不再使用“ ”行分隔符。

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

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

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

正如 Orion 所说,使用第 3 方 DLL 时需要小心,尽管我的合著者写了一个 原生探针 如果您确实想快速检查第 3 方软件,则可以使用该工具来分析 DLL 的 P/Invoke 依赖性。

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

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

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

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

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

除此之外,一切都非常简单。我记得我们第一次 在 Mono/Linux 上运行的 GUI - 这非常令人兴奋(即使 曾是 很难看)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top