C# .NET与C# Mono之间的库兼容性问题

4
我想尝试使用C#进行通用编程(非Web开发)。我在Windows环境中编程,但我想避免专门为Windows(.NET)编写代码,因为我希望将来可以迁移到Linux。
1. 在C# .NET中是否有特定的库,在一般目的编程工作中无法在C# Mono中运行(不感兴趣的Windows Forms、Silverlight等)? 2. 是否有互联网链接提供了一个清单,列出了C# .NET无法在C# Mono上工作或反之的功能列表?我没有在谷歌上找到相关内容。
注:我对具体答案感兴趣,而不是哪个更好或更差的观点(谢谢!)

1
当网站恢复时的Mono兼容性#2 http://mono-project.com/Compatibility - Alexandre Rondeau
谢谢,我看了那个页面,但是这些都非常特定于应用程序/网站开发。有没有通用性的东西? - uday
你有没有在列表前面读最后一段?它明确表示:“描述Mono当前支持的最简单的方法是:除了WPF、WWF以及受限的WCF和受限的ASP.NET 4.5异步堆栈之外,Mono支持.NET 4.5中的所有内容。” - Magus
我做了。但是有很多由独立供应商发布的统计/数学库。那个列表只是谈论Mono开发人员担心的标准问题。我希望从这里得到的其中一件事是来自使用标准应用程序/网站之外的库的C#用户的经验。例如,http://bluemountaincapital.github.io/Deedle/是一个为.NET(C#和F#)发布的库,我找不到它是否在Mono下工作。 - uday
1
我认为你可以一般性地假设答案是否定的。据我所知,Mono不具备二进制兼容性,需要重新编译。如果供应商没有为Mono编译它,你可能无法使用它。因为我只是大致确定,所以我没有将其作为答案。 - Magus
Mono是二进制兼容的,不需要重新编译。通常情况下答案是“是”,除非库使用了P/Invoke或者没有正确使用System.IO.Path方法来构造文件路径。 - jstedfast
2个回答

7
  1. 只要CLR程序集没有依赖Mono不存在的组件,甚至以DLL形式存在,就可以被Mono读取。
  2. 并不是所有为.NET编译的代码都可以在Mono中编译通过,因为.NET中有许多Windows特有的东西(不是C#的严格部分),这些东西没有被实现(如WPF、ASP.NET异步堆栈),或者在Linux中根本没有意义(我认为COM就是其中之一)。

幸运的是,这里有一个列出了Mono中实现了哪些.NET功能的列表。更加幸运的是,他们似乎有一款应用程序,可以事先告诉你是否使用了任何Mono未实现的功能(但我从未尝试过)。


3
这不完全正确。使用 .Net 编译的 C# 库,只要没有使用任何特定于 Windows 的技术(例如 WPF),就可以在 Mono 上正常工作。您不需要重新编译 dll。例如,OpenTK 就是这样工作的:一个单独的 .Net dll 可以在 .Net 和 Mono 上都运行(Windows、Linux、Mac OS X),无需重新编译。 - The Fiddler
@TheFiddler 这很奇怪,因为我记得尝试过一个非常简单的库,但失败了。这一定是别的什么问题,因为你说的对——一个可移植编写的 DLL 应该可以运行。感谢你的纠正。 - Theodoros Chatzigiannakis

4

我不确定,但我认为Mono并不局限于PCL。这些更多是针对移动平台和它们之间的限制。 - kenny
@kenny 实际上恰恰相反(在使用Xamarin的情况下),在PCL中,您应该将所有不特定于平台的代码放在一起,并为每个平台创建单独的UI实现。 - Z .
是的,但 Mono 不仅限于 PCL,远非对其运行的好坏具有决定性。PCL 有利于实现抽象化,但大多数 .NET 代码在 Mono 上都可以无障碍地运行。 - SKall
可移植类库已经过时,现在是.NET Standard。 - nyconing

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