Поставленная задача:

  • Программа должна создавать исполняемый файл EXE, который запускает указанный стартовый сценарий односкрипта без показа окна терминала.
  • Файл EXE должен интегрировать в себя стартовый сценарий.
  • Должна быть возможность извлечь стартовый сценарий из EXE файла.
  • При просмотре свойств EXE файла должна быть видна информация о версии продукта, авторских правах и другая информация.
  • Описание:

    Был создан проект на c# с типом выходных данных "Приложение Windows" состоящий из одного файла Program.cs. С помощью класса Microsoft.CSharp.CSharpCodeProvider из набора файлов компилируется EXE файл.

    В наборе файлов есть AssemblyInfo.cs, в котором мы задаем информацию для отображения в свойствах EXE файла, и файл для сохранения текста сценария.

    Необходимые данные программа возьмет из отредактированного Вами файла settings.cfg. При его отсутствии он будет создан по шаблону при первом запуске OneScriptNoConsole.exe. Все сообщения программа будет писать в файл error.log.

    Версия односкрипта будет соответствовать версии приложенных библиотек ScriptEngine.dll, ScriptEngine.HostedScript.dll, OneScript.Language.dll, Newtonsoft.Json.dll. Сам файл oscript.exe как таковой не используется.

    При успешной компиляции в каталог будут записаны файлы oscript.cfg и .\lib\package-loader.os. В каталог .\lib запишите нужные Вам пакеты односкрипта (в большинстве случаев нет необходимости).

    Более подробное описание:

    При создании EXE файла в него внедряется код стартового сценария, для того чтобы при переносе своего приложения не нужно было заботиться и о его переносе тоже. При запуске скомпилированного EXE стартовый сценарий извлекается и как строка используется для запуска. Но в этом случае сценарий не может возвратить свойство Источник и директива

    #Использовать ".\" 
    
    не будет корректно отрабатывать. Эта проблема решена в библиотеке отдельным кодом, который при указанном выше виде директивы (с указанием места поиска скриптов ".\" ) ищет рядом со стартовым сценарием каталоги Классы и Модули и подключает найденные сценарии. Недостаток всего этого в том, что для подключенных скриптов нужно дополнительно самому создать объект подключенного скрипта.

    Рассмотрим на примере пакета fs из комплекта поставки OneScript. Код стартового сценария Приложение.os приведен ниже. Создаем каталог Классы рядом с Приложение.os и копируем в него ..\OneScript\lib\fs\Модули\ФС.os

    #Использовать ".\"
    
    // Вот эту строку нам необходимо 
    // прописать самим. Создаем 
    // объект подключенного скрипта.
    ФС = Новый ФС();
    
    Если ФС.Существует("C:\555\") Тогда
      Сообщить("Каталог существует");
    Иначе
    	Сообщить("Не существует");
    КонецЕсли;
    

    Компилируем программу (стартовый сценарий) посредством файла OneScriptNoConsole.exe и объект ФС будет работать. Такой подход оправдан для малых проектов или самописных без использования пакетов.

    В релизе 1.2.0.0 добавлена возможность запуска стартового сценария из файла через указание ключа /startFrom="file" в файле настроек для компиляции settings.cfg. Отличие в том, что извлекаемый из EXE код стартового сценария сначала записывается на диск в том же каталоге под именем temp.os, а затем стартует. И тогда, если мы скопировали нужные нам пакеты в каталог lib можно использовать директиву в таком виде

    #Использовать fs
    
    то есть всё как обычно. Плюс отсутствие окна DOS и плюс наши данные в свойствах EXE файла.