.Net框架究竟有多跨平台?

10

如何在 Mac 或 Linux 机器上运行 WinForms 应用程序?

a. 只需复制并运行(假设已安装 Framework)。
b. 重建。
c. 美化源代码。
d. 大量修改源代码和重新设计表单。

假设该应用程序是采用 Visual C# Express 或 Visual Studio 2008,以 .Net Framework 3.5 为目标,100% 管理的 C# 3 代码开发而成,没有使用任何第三方组件/库,也没有封装非托管代码或任何低级别的黑客技术 - 仅使用 Microsoft 文档化的标准 .Net Framework C# API。或者相同的条件但是采用C# 4语言、.Net Framework 4和Visual Studio 2010。

是否有一个实用的指南,可以指导使用 MS .Net Framework 和 Visual Studio 开发 Mono-ready 应用程序?是否有任何指导方针、提示、特定方面的亮点,告诉开发人员编写易于移植的应用程序时需要牢记的内容,而不必在 Visual Studio 中每次编码时都查询 Mono 参考文献中的每个函数。

4个回答

12

你的应用程序可能会在不做任何修改的情况下运行,但我还没有看到这种情况在现实世界中发生过。

一个可能会对你有很大帮助的工具是MoMA。MoMA由制作Mono的同一组人制作,它会告诉你是否使用了尚未移植的任何功能。

总体而言,.NET 3.5和Winforms基本上都可以。与版本4的兼容性仍在积极开发中。

如果你在Windows上进行开发,那么一个更加最新的工具是Microsoft的.NET可移植性分析器。这可以通过Visual Studio使用。


你的应用程序可能只需零修改即可运行,这是有可能的。但我很难相信这一点,因为在Windows机器上构建和运行的应用程序是一个Windows EXE文件(不像Java的JAR文件不特定于平台)。你是指 .Net EXE 可以在安装了Mono而非Wine的Mac或Linux上运行吗? - Ivan
10
是的,一个.NET可执行文件并不是一个普通的Windows二进制文件,它是一个包含代码的文件,在一个虚拟机(CLR)中运行,与Java非常相似。 - andypaxo
1
@Ivan:我相信有一个小的特定于Windows的可执行代码存根,它只是引导到CLR执行,但是.NET EXE文件中的大部分数据都是MSIL,而不是x86机器语言。 Mono只需跳过引导代码并读取MSIL,因此它是完全兼容的。 - Daniel Pryden
@Daniel:在较新的Windows版本中,引导程序甚至都不会运行;可执行文件加载器将检测是否为.NET EXE并直接传递给CLR。如果WINE也能像Mono一样做到这一点就好了。但是,有些混合模式可执行文件既包含MSIL又包含特定于平台的代码。这些文件在Windows之外无法使用,但幸运的是它们本来就很少见。 - Chris Charabaruk
2
MoMA并非万能解决方案。您仍需要在目标操作系统上测试应用程序。我向Mono提交了多个错误报告,因为我的应用程序通过了MoMA测试,但在目标操作系统上失败了。许多API已经实现,但它们可能与.NET行为不匹配或者会抛出异常。 - Lex Li
@Lex 确实,说得好。没有什么比实际看到你的应用程序运行更好的替代品了。 - andypaxo

5
如果是使用标准的Windows Forms控件,没有第三方组件的Windows Forms应用程序,则通常可以直接在Mono上运行,只需复制并运行即可。
Mono非常好地支持Windows Forms和C# 3功能。
然而,如果您使用任何本地组件、超出Mono支持范围的数据访问或WPF,则会遇到问题。此时,C# 4/.NET 4很可能也无法正常工作。

我仍然遇到resx和libgdiplus的一些问题。:) 幸运的是,它们可以解决。 - Lex Li

1

嗯,我没有开发过大型项目,但从我的经验来看,您需要对代码进行一些微小的修改,但只是为了完善一些东西。应用程序本身应该可以在不重新编译的情况下正常运行。至于Windows表单,我发现在使用GDi时有时非常慢,但也许我做错了什么。然而,Mono团队声称它完全支持Windows表单。

还有一件值得一提的事情。编写跨平台应用程序非常困难,如果不使用一些本地操作系统功能,就很难避免出现问题。我认为您应该始终考虑编写一些额外的特定于操作系统的模块,以提供与底层操作系统的紧密集成,并利用一些很酷的功能(例如OSX中的令人惊叹的工具栏功能)。您还应该记住,人们习惯于在不同的操作系统上看到不同的外观和感觉。


0

从理论上讲,.Net 是完全跨平台的,因为它不依赖于特定的体系结构,而是依赖于虚拟机。

然而,在实践中,你有Windows的Microsoft实现和Linux/Mac的Mono实现。主要问题在于这些实现可能会彼此不同,这使得很难直接在多台机器上运行应用程序。

如果没有一些库被移植到Mono上或使用不同的库,源代码不应该被修改。

C# 4 可能会更困难,因为Mono还没有更新到与Microsoft实现相匹配。


2
事实是,Mono对Microsoft.NET进行了大量测试,包括在我没记错的情况下复制实现怪癖,其中MS.NET与ECMA CLR标准不同。两个CLR实现之间出现不兼容性的地方通常是Microsoft中全新的内容,或者是Mono中未完成的工作。 - Chris Charabaruk

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