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

时间:2013-12-04 18:07:00

标签: .net linux mono

我正在尝试使用Mono,但我正在努力处理有关SO的文档,博客和其他问题。希望这个问题对其他人有用。

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

假设在目标Linux机器上安装了Mono(但不是MonoDevelop),我是否需要以不同的方式编译我的.csproj,以便在Linux上的Mono'CLR'下运行,如果是这样,我如何编译项目,如与编译单个.cs文件的示例相反?

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

否则,在Mono下,在MSBuild编译的.EXE程序集中的IL“只能在Linux上运行”,并且引用的程序集可以正常加载(假设它们都在输出文件夹中)?我必须复制任何.NET Framework程序集吗?

2 个答案:

答案 0 :(得分:14)

你的问题的一个非常好的答案在于Mono FAQ

  

单声道二进制是否与Windows兼容?

     

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

     

移植应用程序时,应确保对其进行测试   功能作为底层操作系统的差异和   VM实现(错误,缺少功能)的差异可能会   影响你的申请。

     

Mono没有实现所有.NET 1.1 API(请参阅Mono   Mono 1.0)的发行说明以及从Windows执行二进制文件时   如果使用未实现的API,您可能会收到一条晦涩难懂的消息   没有找到令牌。

     

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

     

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

     

是否有任何理由在Mono上构建而不是使用Visual Studio   并复制二进制文件?

     

通常,您可以继续使用Visual Studio编写代码   如果你觉得这样做很舒服。

     

使用Linux开发将鼓励您测试您的软件   Linux更频繁,如果你有机会,它也会有所帮助   你要“养狗”自己的产品。

这个常见问题解答有点旧(它正在讨论Mono 1.0),但上述情况仍然适用于我的经验。使用Mono(或在MonoDevelop或Xamarin Studio中进行开发)进行编译总是很好,以确保您没有使用任何特定于Microsoft的库。

至少,您应该使用可以在没有Visual Studio的情况下运行的测试套件(因此,请避免使用内置的Microsoft测试工具)。这样,您就可以在计划部署的所有系统上运行测试。 MonoDevelop附带NUnit,可在Windows,Linux和OS X上运行。

一些快速,额外的想法:

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

答案 1 :(得分:2)

按照设计,Mono应该被编译一次并在任何地方执行。如果在Windows和Linux上编译相同的程序,它们应该是二进制等价的。你不应该做任何额外的事情。

阅读他们的FAQ,特别是第二个问题:“Mono Binary是否与Windows兼容?”

  

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