如何在C#中进行条件编译以适配Mono和Microsoft .NET?

35

我需要一个条件编译开关,能够知道我是为Mono还是MS .NET运行时编译。我该怎么做?

2个回答

60

Mono编译器定义了__MonoCS__

但是,但是,但是,Mono的整个重点在于可以使用在VS中构建的程序集在Mono上运行,反之亦然。

我认为,如果你需要区分Mono和MS.NET的差异,那么你需要在运行时做出这些决策。

检测Mono的标准方式是在运行时进行:

bool runningOnMono = Type.GetType ("Mono.Runtime") != null;

4
有时候你需要使用条件编译。例如,Mono不支持属性ViewStateModeById,如果你已经用这个属性标记了一个类,就会在运行时出现错误。所以,你说的并不完全准确。 - Thomas Hansen
7
理解重点,但是Mono在某些方面需要赶上,惩罚MS的构建没有意义...不过还是很有用的建议,谢谢。 - Frep D-Oronge
2
一个使用案例是在Mono上有GTK# GUI,在.Net上有Windows.Forms GUI。 - Ivan Vučica
有时候需要使用宏,因为Mono无法编译在Windows上可以正常编译的内容。例如:AppDomain.CurrentDomain.FirstChanceException在Mono上就没有定义。 - Sergiy Belozorov
1
但是,但是,但是,Mono 的整个重点不就在于您可以使用 VS 构建的程序集在 Mono 上运行,反之亦然吗?这取决于平台...... Xamarins Mac 和移动产品怎么样?他们发明了 Mono,但他们却不这样做。所以您显然是错的。虽然有时是有效的,但有时也是无效的。 - AnthonyLambert
显示剩余7条评论

1

很明显,有时候一个平台上的代码会与另一个平台上的代码不同,您可能希望在运行时或编译时执行此操作。有时无法在运行时完成。

例如:

Mono被用作Xamarin的Ios、Android和Mac工具包的基础。虽然它们有很多共同的代码,但也有一些只出现在单个平台上的类。使用这些工具包进行开发时,您会开发本地软件包,这些软件包不能在平台之间交换。

一个简单的例子是文件名和路径。这些在每个平台上都不同。我可能需要一个小条件来在每个平台上以不同的方式加载字符串。有些平台有特定于大小写的文件名,而有些则没有。

如果有一小段代码可以返回当前平台——无论是UNIX、iOS、Mac、X86、X64还是XBox等,那就太好了。


1
.NET已经有处理路径的可移植抽象。例如,System.IO.Path.DirectorySeparatorChar。因此,无需构建自己的逻辑来处理该情况的不同操作系统可能性。 - Nate C-K

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