【问题标题】:How to detect that F# program is compiled on Mono?如何检测 F# 程序是在 Mono 上编译的?
【发布时间】:2018-05-17 18:35:21
【问题描述】:

我正在尝试根据编译时环境使一些 F# 代码有条件,但找不到 F# 编译器可以识别的任何特定于操作系统的定义。 #如果单声道不起作用。有没有办法在 F# 的编译时检测操作系统?

【问题讨论】:

    标签: compilation f# mono preprocessor


    【解决方案1】:

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

    也就是说,我会小心一点——在 F# 和 .NET 中没有明确的“为 Mono 编译”的概念。当你编译 F# 代码时,你总是会得到一个 dllexe,你可以在任何地方运行,没有什么能阻止你复制一个构建输出并在另一个环境中运行它。

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

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

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

    【讨论】:

    • 谢谢托马斯。我同意如果 F# 程序使用条件 OS 编译,这是一个不好的迹象。我之所以想尝试这个,是因为我无法在 Mac 上使用 SOURCE_DIRECTORY 定义,所以我想尝试使用预处理器指令的解决方法。
    • @VagifAbilov __SOURCE_DIRECTORY__ 遇到了什么问题?不过,这在脚本中更有用 - 我不会在编译的代码中使用它(通常,您需要一个相对于应用程序运行位置的目录,而不是它的编译位置 - 您可以通过当前执行的程序集获得它)。
    • @TomasPerticek 这是因为 F# SQLProvider 我正在使用 SOURCE_DIRECTORY。我们最近在 SQLProvider 中添加了对离线模式的支持,现在它支持引用序列化模式,所以我有一个设置 ContextSchemaPath=__SOURCE_DIRECTORY__ + ".some file" 仅在编译时使用。但是在 Mac 上它没有指向正确的位置,所以我尝试使用 #ifdef 来解决它。
    • @VagifAbilov 这很有道理!在那种情况下,我完全理解你在编译时需要这个。我想找到根本原因会很好 - 类型提供程序是否获得了有效路径?
    • 类型提供程序在 Windows 上获得了正确的路径,但在 Mac 上却没有。但是,如果我在 Mac 上发送一个绝对路径(没有 SOURCE_DIRECTORY),那么它就可以工作。所以提供者本身可以在两个平台上工作,只是 SOURCE_DIRECTORY 在 Mac 上没有正确设置(似乎)。我现在离我的 Mac 还很远,但我在家时会进行更多测试。
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多