1

我没有在命令行上找到用于编译 F# 源代码然后在 Mac OS 上运行它的文档。这是我尝试过的,但没有奏效。

首先,我有一个词法分析器规范文件“ExprLex_hj.fsl”。我使用从网站获取的奇怪命令行生成了词法分析器:

 mono ~/.nuget/packages/fslexyacc/10.0.0/build/fslex/net46/fslex.exe --unicode ExprLex_hj.fsl

上面的行生成了一个名为“ExprLex_hj.fs”的文件。然后我用从另一个网站复制的另一个奇怪的命令行编译了那个 f# 文件

fsharpc -r ~/.nuget/packages/fslexyacc/10.0.0/build/fsyacc/net46/FsLexYacc.Runtime.dll ExprLex_hj.fs

上面的这一行在我的 Mac OS 上生成了一个 EXE 文件,ExprLex_hj.exe. 现在我需要运行这个 EXE 文件。我听说我们可以使用 mono,这是 Microsoft 的 .NET Framework 的开源实现。所以,我尝试了

mono ExprLex_hj.exe

繁荣!我收到一个错误:

未处理的异常:System.BadImageFormatException:无法解析字段令牌 0x04000008,原因是:无法加载字段类型“<StartupCode$ExprLex_hj>.$ExprLex:_fslex_tables@24”(2),原因是:无法加载文件或程序集“ FsLexYacc.Runtime、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' 或其依赖项之一。程序集:/Users/zell/test_lexer_fsharp/ExprLex_hj.exe 类型:$ExprLex 成员:(空)

你能告诉我如何解决这个问题吗?问题是关于如何运行从 F# 源文件生成的可执行文件的文档很少。大多数教程建议使用 .FSX 或在 REPL 上运行 af# 文件,这不是我想要的——我想从命令行执行生成的二进制文件。

此外,在我的机器上,我安装了 Visual Studio,但我仍然需要知道执行 EXE 的命令行方式。此外,在安装 Visual Studio 后,我的 PATH 中出现了“fshapri”、“fsharpc”、“mono”和“dotnet”。我实际上不确定在这种情况下是否应该使用“mono”或“dotnet”来运行 EXE。

4

1 回答 1

3

Mono正在走向灭绝。它正在被 .NET 5(.NET core 3.x 和 .NET framework 4.7x 的继任者)取代。与此同时,在您的特定场景中,您应该使用 .NET core,因为这样会减少问题。您关注的教程或链接必须很旧。

使用 .NET 核心,您构建的是 dll 而不是 exe,即使它是可执行文件。要运行它们,您可以这样做dotnet myFile.dll。这适用于您在 Windows、Linux 或 Mac 中。

要构建 .NET 核心应用程序,请使用dotnet build. 但是因为你有 Visual Studio for Mac 可以为你做这件事;只需确保使用 F# 创建一个 .NET 核心项目。

您将需要使用 .net core 3.x 版本的 fslexyacc 而不是 .Net framework 4.6。任何针对 .Net 框架 4.6 的东西都是为 Windows 设计的。Mono 可能能够运行它,但支持不完整。那么,如果 .NET 核心在 Mac 中本机运行,为什么复杂化很重要。

要获取此 dll,您可以从https://github.com/fsprojects/FsLexYacc.git构建它。或者使用nuget。要使用 nuget 在 Nuget 包中的 VS for Mac(.NET 核心控制台 F#)中创建一个空白的新项目,请添加 Fslexyacc。

fslex 的二进制文件(在 Mac 中)将放在 ~/.nuget/packages/fslexyacc/10.0.0/build/fslex/netcoreapp3.0/.

从那里你应该能够构建你的词法分析器:

dotnet fslex.dll --unicode ExprLex_hj.fsl

ExprLex_hj.fs添加到您的项目中,构建。FsLexYacc.Runtime.dll添加 nuget 包时应该已将其添加为参考。那应该行得通。

于 2020-08-06T16:30:46.567 回答