如何检测 F# 程序是在 Mono 上编译的?

How to detect that F# program is compiled on Mono?

我正在尝试根据编译时环境使某些 F# 代码有条件,但找不到 F# 编译器可以识别的任何 OS 特定定义。 #if MONO 不起作用。有没有办法在 F# 的编译时检测 OS?

我认为没有任何开箱即用的方法可以做到这一点。您将需要定义自己的符号,例如 MONO 并在构建 Mono 版本时使用 --define:MONO 调用编译器。

也就是说,我对此要小心一些 - F# 和 .NET 中没有明确的 "compiled for Mono" 概念。当您编译 F# 代码时,您总是会得到一个 dllexe,您可以在任何地方 运行 并且没有什么可以阻止您复制一个构建输出并 运行 在另一个环境中使用它.

有一种标准方法可以在 运行 时间 检测程序 运行 宁 的位置,使用:

Type.GetType("Mono.Runtime") != null

您可能有充分的理由想要两个单独的构建,但可能值得考虑您是否可以在 运行 时间做出适当的选择(如果您依赖某些 Windows-特定的库,例如 WinForms 图表)。