Как в командной строке скомпилировать лексер F #, а затем запустить его в ОС Ma c? - PullRequest
1 голос
/ 05 августа 2020

Я не нахожу в командной строке документов для компиляции исходного кода F # и его последующего запуска в ОС Ma c. Вот то, что я пробовал, но не сработало.

Во-первых, у меня есть файл спецификации лексера «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

Эта строка выше создает EXE-файл в моей Ma c OS, ExprLex_hj.exe. Теперь мне нужно запустить этот EXE-файл. Я слышал, что мы можем сделать это с помощью mono, реализации Microsoft. NET Framework с открытым исходным кодом. Итак, я попробовал

mono ExprLex_hj.exe

Бум! Я получил сообщение об ошибке:

Необработанное исключение: System.BadImageFormatException: не удалось разрешить токен поля 0x04000008 из-за: Не удалось загрузить тип поля ' . $ExprLex:_fslex_tables@24 '(2) из-за: Не удалось загрузить файл или сборку' FsLexYa cc .Runtime, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null 'или одну из его зависимостей. сборка: /Users/zell/test_lexer_fsharp/ExprLex_hj.exe тип: $ ExprLex member: (null)

Подскажите, как решить эту проблему? Дело в том, что можно найти немного документации о том, как запустить исполняемый файл, созданный из исходного файла F #. В большинстве руководств предлагается использовать .FSX или запускать af # файл в REPL, что мне не подходит - я хотел бы выполнить сгенерированный двоичный файл из командной строки.

Кроме того, на моем компьютере у меня есть Visual Studio установлена, но мне все еще нужно знать способ запуска EXE из командной строки. Кроме того, после установки Visual Studio я получил «fshapri», «fsharp c», «mono» и «do tnet» в моем PATH. На самом деле я не уверен, следует ли мне использовать «mono» или «do tnet» для запуска EXE в этой ситуации.

1 Ответ

3 голосов
/ 06 августа 2020

Моно находится на пути к исчезновению. Он заменяется на. NET 5 (преемник. NET core 3.x и. NET framework 4.7x) Тем временем и в вашем конкретном сценарии вы должны использовать. NET core, поскольку это приведет к меньшему количеству вопросов. Учебник или ссылки, по которым вы переходите, должны быть довольно старыми.

Используя. NET core, вы создаете библиотеки DLL, а не exes, даже если это исполняемый файл. Чтобы запустить их, вы делаете dotnet myFile.dll. Это работает, если вы находитесь в Windows, Linux или в Ma c.

Для сборки NET основных приложений используйте dotnet build. Но поскольку у вас есть Visual Studio for Ma c, он сделает это за вас; Просто убедитесь, что вы создали основной проект. NET с F #.

. Вам нужно будет использовать. net core 3.x версию fslexya cc, а не. Net framework 4.6. Все нацелено. Net framework 4.6 предназначен для Windows. Mono может запустить его, но поддержка неоднородна. Так зачем же все усложнять, если ядро. NET изначально работает в Ma c.

Чтобы получить эту dll, вы можете либо собрать ее из https://github.com/fsprojects/FsLexYacc.git. Или используйте nuget. Чтобы использовать nuget, создайте пустой новый проект в VS для Ma c (. NET основная консоль F #) в пакетах Nuget добавьте Fslexya cc.

двоичный файл для fslex (в Ma c ) будет помещен в ~/.nuget/packages/fslexyacc/10.0.0/build/fslex/netcoreapp3.0/.

Оттуда вы сможете собрать свой лексер:

dotnet fslex.dll --unicode ExprLex_hj.fsl

Добавьте ExprLex_hj.fs в свой проект, соберите . FsLexYacc.Runtime.dll должно было быть добавлено в качестве ссылки при добавлении пакета nuget. Это должно сработать.

...