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

Compilation 如何检测F#程序是在Mono上编译的?,compilation,f#,mono,preprocessor,Compilation,F#,Mono,Preprocessor,我试图基于编译时环境使一些F#代码有条件,但找不到F#编译器能够识别的任何特定于操作系统的定义#如果MONO不起作用。有没有办法在F#的编译时检测操作系统?我不认为有任何现成的方法可以做到这一点。您需要定义自己的符号,例如MONO,并在构建MONO版本时使用--define:MONO调用编译器 尽管如此,我还是要小心一点——在F#和.NET中没有“为单声道编译”的明确概念。编译F#code时,您总是会得到一个dll或exe,可以在任何地方运行,并且没有任何东西可以阻止您复制一个生成输出并在另一个

我试图基于编译时环境使一些F#代码有条件,但找不到F#编译器能够识别的任何特定于操作系统的定义#如果MONO不起作用。有没有办法在F#的编译时检测操作系统?

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

尽管如此,我还是要小心一点——在F#和.NET中没有“为单声道编译”的明确概念。编译F#code时,您总是会得到一个
dll
exe
,可以在任何地方运行,并且没有任何东西可以阻止您复制一个生成输出并在另一个环境中运行它

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


您可能有很好的理由想要两个独立的版本,但您是否可以在运行时做出适当的选择可能是值得考虑的(如果您依赖于某些Windows特定的库,如WinForms图表,这可能不起作用)。

谢谢您,Tomas。我同意,如果F#程序使用条件操作系统编译,这是一个坏兆头。我之所以想这样做,是因为我无法在Mac上使用源目录定义,所以我想使用预处理器指令来尝试解决方法。@VagifAbilov您在使用
\uuuuuu源目录时遇到了什么问题?不过,这在脚本中更有用-我不会在编译代码中使用它(通常,您需要一个相对于应用程序运行位置的目录,而不是相对于编译位置的目录-您可以通过当前正在执行的程序集获得该目录)。@TomasPerticek这是因为我使用的是F#SQLProvider源目录。我们最近在SQLProvider中添加了对脱机模式的支持,现在它支持引用序列化模式,所以我有一个设置ContextSchemaPath=\uuuuu SOURCE\u DIRECTORY\uuuuu+“.some file”,该设置仅在编译时使用。但在Mac上,它并没有指向正确的位置,所以我试图用#ifdef@VagifAbilov解决它,这是有道理的!在这种情况下,我完全理解您在编译时需要它。我想最好找到根本原因-类型提供程序是否获得了有效路径?类型提供程序在Windows上获得了正确路径,但在Mac上没有。但是如果我在Mac上发送一个绝对路径(没有源目录),那么它就可以工作了。所以提供者本身在这两种平台上都可以工作,只是源目录在Mac上没有正确设置(看起来)。我现在离我的Mac电脑很远,但在家时会进行更多的测试。
Type.GetType("Mono.Runtime") != null