【问题标题】:Library compatibility between C# .NET vs C# MonoC# .NET 与 C# Mono 之间的库兼容性
【发布时间】:2014-03-19 01:10:07
【问题描述】:

我想试用 C# 进行通用编程(不是 Web 开发)。我在 Windows 环境中编程,但我想避免专门为 Windows (.NET) 编写代码,因为我想为将来迁移到 Linux 保留选项。

  1. C# .NET 中是否有任何特定的库不能在 C# Mono 中用于通用编程工作(对 Windows 窗体、Silverlight 和类似的东西不感兴趣)?

  2. 是否有任何事物/功能的 Internet 链接提供适用于 C# 的列表。NET 不适用于 C# Mono,反之亦然?我本身并没有轻易在谷歌中找到任何东西。

注意:我对具体答案感兴趣,而不是对哪个更好或更坏的意见(谢谢!)

【问题讨论】:

  • 网站恢复时的单声道兼容性#2 mono-project.com/Compatibility
  • 谢谢,我查看了那个页面,但这些都是针对应用程序/Web 开发的。有什么通用的吗?
  • 您是否阅读了列表前的最后一段?它特别说The easiest way to describe what Mono currently supports is: Everything in .NET 4.5 except WPF, WWF, and with limited WCF and limited ASP.NET 4.5 async stack.
  • 我做到了。但是有很多独立供应商发布的统计/数学库。该列表仅谈论 Mono 开发人员担心的标准内容。我希望从这里获得的一件事是 C# 用户使用标准应用程序/Web 以外的库的经验。例如,bluemountaincapital.github.io/Deedle 是为 .NET(C# 和 F#)发布的库,我找不到它是否可以在 Mono 下工作。
  • 我认为您通常可以假设答案是否定的。据我所知,Mono 不是二进制兼容的。它需要重新编译。如果供应商没有为单声道编译它,你可能无法用它做任何事情。因为我只是很确定,所以我没有给出这个答案。

标签: c# mono


【解决方案1】:
  1. Mono 可以读取 CLR 程序集(即使是 DLL 的形式,如 cmets 中所述),只要它不具有 Mono 中不存在的依赖项,因为...
  2. ...不是为 .NET 编译的每一段代码都会为 Mono 编译,因为 .NET 中有很多特定于 Windows 的东西(严格来说不是 C# 的一部分)没有实现(WPF、ASP.NET)。 NET 异步堆栈)或在 Linux 中根本没有意义(我认为 COM 就是这样一个例子)。

还好有a list of what .NET features are implemented in Mono。更幸运的是,他们似乎有an app that tells you a priori whether your code makes use of anything not implemented in Mono(但我从未尝试过)。

【讨论】:

  • 这并不完全正确。只要不使用任何特定于 Windows 的技术(例如 WPF),使用 .Net 编译的 C# 库就可以在 Mono 上正常工作。您不需要重新编译 dll。这就是例如OpenTK 工作:一个可以在 .Net 和 Mono(Windows、Linux、Mac OS X)上工作的单个 .Net dll,无需重新编译。
  • @TheFiddler 这很奇怪,因为我记得用一个非常小的库尝试过这个,但它失败了。它一定是别的东西,因为看起来你是对的 - 一个可移植编写的 DLL 应该运行。谢谢指正。
【解决方案2】:

如果您安装了 xamarin(您需要 Pro 或更大版本,以便您拥有 VS 集成),您可以创建针对 xamarin(基于单声道)的可移植类库,并且 Visual Studio 将允许您仅使用与单声道兼容的类.

http://docs.xamarin.com/guides/cross-platform/application_fundamentals/pcl/introduction_to_portable_class_libraries/

显然您也可以使用 xamarin studio 创建 PCL,并且有免费版本。

【讨论】:

  • 我不肯定,但我不认为 Mono 仅限于 PCL。这些更多是针对移动平台和它们之间的限制。
  • @kenny 实际上恰恰相反,(在使用 xamarin 的情况下)在 pcl 中,您应该将所有非平台特定的代码放入并为每个 UI 创建单独的实现平台。
  • 是的,但 Mono 不限于 PCL,远非如此,因此它不能很好地指示将运行什么。 PCL 有利于执行抽象,但大多数 .NET 代码将在 Mono 上运行而不会出现问题。
  • 可移植类库已过时。现在是 .NET Standard。
猜你喜欢
  • 2021-08-27
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多