如何在Windows上编写C#代码,但在Linux上运行?

11

我想使用Mono开始编程,但是我在文档、博客和其他stackoverflow问题上遇到了困难。希望这个问题对其他人有用。

我想使用VS2013用C#编写一个数据摄取程序,因为那是我的母语,但我需要在Linux上运行它。没有UI,只是控制台应用程序。

假设目标Linux机器已安装了Mono(但未安装 MonoDevelop),那么我是否需要为在Linux的Mono“CLR”下运行而编译我的 .csproj文件,如果需要,我应该如何编译项目,而不是编译单个的 .cs 文件的示例呢?

我应该在Windows上安装MonoDevelop,将我的解决方案/项目打开在那个IDE中,并将其编译为Linux,然后复制输出文件并在那里运行 .exe 吗?

否则,MSBuild编译的 .EXE 程序集中的IL代码是否可以在Mono下的Linux上“顺利运作”,引用的程序集是否会被正确加载(假设它们都在输出文件夹中)?是否必须复制任何 .NET Framework 程序集?


1
编写一次,到处测试。注意避免使用 P/Invoke 或覆盖 WndProc。 - Joshua
为什么不试一下呢?运行 mono yourApplication.exe 然后看看它会做什么。 - svick
@svick 很好的问题。两个原因:a)IT还没有在这台机器上安装Mono b)在编写任何代码之前,我正在评估未来团队成员在Linux上维护.NET应用程序的复杂程度。 - Luke Puplett
2个回答

18
您问题的一个很好的答案可以在Mono的常见问题解答中找到:

Mono与Windows二进制兼容吗?

是的,Mono与Windows二进制兼容。这意味着您可以运行由微软和其他供应商的.NET编译器生成的二进制文件。

当移植您的应用程序时,您应该确保测试其功能,因为底层操作系统的差异以及VM实现(错误、缺少功能)的差异可能会影响您的应用程序。

Mono并没有实现每个.NET 1.1 API(请参阅Mono 1.0的发布说明),当执行来自使用未实现API的Windows的二进制文件时,您可能会收到关于找不到标记的晦涩消息。

在这些情况下,使用Mono的C#编译器编译应用程序是有用的,只是为了确保你正在使用受支持的API。

这并不是一个完美的解决方案,因为Mono中的一些API在某些情况下会抛出NotImplementedExceptions,所以你仍然应该用Mono测试你的应用程序。 如果你关心应用程序的可移植性,请检查迁移分析器MoMA。

有没有任何原因要在Mono上构建,而不是使用Visual Studio和复制二进制文件?

一般来说,如果您觉得使用Visual Studio编写代码舒适,可以继续使用它。

使用Linux进行开发将鼓励您更频繁地在Linux上测试软件,如果有机会,还将帮助您“dogfood”自己的产品。

这个FAQ有点老了(它讨论的是Mono 1.0),但我的经验表明上述仍然成立。最好使用Mono编译(或者使用MonoDevelop或Xamarin Studio进行开发)确保您没有使用任何微软特定的库。

至少要使用一个可在不依赖于Visual Studio测试工具的情况下运行的测试套件,以便您可以在计划部署到的所有系统上运行测试。MonoDevelop附带了NUnit,可以在Windows、Linux和OS X上运行。

一些快速的额外想法:

  1. 不要在代码中将Windows路径分隔符(“\”)用作文字。请使用System.IO.Path.PathSeparator
  2. 始终使用System.Environment.NewLine而不是换行符(\n)和回车符(\r)。

太好了,这就是我启动理解所需要的一切。 - Luke Puplett

4
Mono的设计理念是一次编译,到处运行。如果你在Windows和Linux上编译同一个程序,它们应该是二进制等价的。你不需要做任何额外的工作。
阅读他们的FAQ,特别是第二个问题:“Mono与Windows二进制兼容吗?”
引用:
“是的,Mono与Windows二进制兼容。这意味着您可以运行由Microsoft和其他供应商的.NET编译器生成的二进制文件。”

你听说过 Microsoft RegisterScripts 和 Mono RegisterScript 吗? - Frank

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