Использование Fore в Fore.NET

Для использования ресурсов сборок/форм/модулей, написанных на языке Fore, в .NET-модулях/формах реализован ряд интерфейсов. Для работы с Fore-объектами необходимо на вкладке «.Net сборки» в окне настройки ссылок .NET-сборки подключить сборку «Prognoz.Platform.Interop.Fore». Для более удобного использования не квалифицированных идентификаторов в области импорта можно добавить строку для импорта содержимого пространства имен данной сборки:

Imports Prognoz.Platform.Interop.Fore;

Для работы с модулями/формами Fore используются следующие интерфейсы:

Интерфейс Краткое описание
IForeServices Базовый интерфейс, содержащий свойства и методы для работы Fore-объектами платформы.
IForeRuntime Интерфейс, содержащий свойства и методы для работы с контекстом выполнения платформы. В данном контексте осуществляется работа со всеми сборками.
IForeAssembly Интерфейс, содержащий свойства и методы для работы с Fore-сборками. Отдельные модули и формы, не входящие в какую-либо сборку, компилируются как отдельная сборка и также реализуются данным интерфейсом.
IForeClass Интерфейс, содержащий свойства и методы для работы с Fore-типами, реализованными в Fore-сборках. Некоторые свойства и методы интерфейса:
  • SubsCount и SubItem. Позволяют работать с коллекцией всех методов класса, включая GET и SET методы, реализующие свойства;
  • BindToMethod. Позволяет получить метод класса по имени. GET и SET методы, которые реализуют свойства, имеют следующую сигнатуру: .Get<Name> и .Set<Name>, где <Name> - наименование свойства;
  • CreateObject. Создает экземпляр объекта класса.

Примечание. В виду особенностей реализации, связанных с созданием экземпляров объектов с помощью метода CreateObject, полученный объект будет полностью соответствовать классу, но при инициализации не будут вызваны конструкторы класса: не вызывается конструктор по умолчанию или какие-либо конструкторы, реализованные в классе. В связи с этим полученный объект может иметь не те значения свойств/полей, которые предполагались логикой его работы. При необходимости конструктор может быть получен и вызван с помощью метода BindToMethod.

IForeSub Интерфейс, содержащий свойства и методы для работы с Fore-методами, реализованными в Fore-типах.
IForeObject Интерфейс, содержащий свойства и методы для работы с экземплярами объектов Fore-типов. Некоторые свойства и методы интерфейса:
  • BindToField. Для экземпляра класса позволяет получить значение поля по его имени.

Примечание. Данные интерфейсы доступны только в языке Fore.NET, либо в языках где используется библиотека платформы Prognoz.Platform.Interop.Fore.dll.

Пример кода на языке Fore.NET

Для выполнения примера предполагается наличие .NET-сборки, в которой создана .NET-форма. На .NET-форме расположена кнопка. В репозитории имеется форма/модуль с идентификатором «UserFunc». В нем реализован класс «TestClass», в классе реализована функция «Test».

Private Sub button1_Click(sender: System.Object; e: System.EventArgs);
Var
    Svc: IForeServices;
    Run: IForeRuntime;
    Assembly: IForeAssembly;
    FClass: IForeClass;
    FSub: IForeSub;
    FObj: IForeObject;
    v: object;
Begin
    Svc := Self.Metabase As IForeServices; //Получаем объект для работы с Fore
    Run := Svc.GetRuntime(); //Получаем контекст, в котором будут выполняться методы Fore
    Run.LoadAssembly("UserFunc"); //Загружаем сборку Fore в контекст выполнения
    Assembly := Run.BindToAssembly("UserFunc"); //Получаем скомпилированную сборку
    FClass := Assembly.BindToClass("TestClass"); //Получаем Fore класс
    FObj := FClass.CreateObject(); //Создаём объект класса
    FSub := FClass.BindToMethod("Test"); //Получаем метод этого класса
    FSub.Self := FObj; //Указываем объект, для которого будет выполняться метод
    FSub.Invoke(); //Выполняем метод
    v := FSub.ResultValue; //Получаем результат выполнения
End Sub;

При нажатии на кнопку будет осуществлен вызов Fore-метода «Test». Результат выполнения будет содержаться в переменной «v».

Если необходимо вызвать конструктор класса, то дополните пример следующими строками кода:

Var
    //...
    FConstructor: IForeSub;
    //...
Begin
    //...
    FObj := FClass.CreateObject(); //Создаём объект класса
    //Вызов конструктора Create без параметров
    FConstructor := FClass.BindToMethod("Create");
    FConstructor.Self := FObj;
    FConstructor.Invoke();
    //Вызов конструктора CreateEx с параметрами
    FConstructor := FClass.BindToMethod("CreateEx");
    FConstructor.Self := FObj;
    FConstructor.Params.Item(0).Value := "Тест";
    FConstructor.Params.Item(1).Value := 100;
    FConstructor.Invoke();
    //...

Если выполняемый метод Test имеет параметры, то дополните пример следующими строками кода:

    //...
    FSub.Self := FObj; //Указываем объект, для которого будет выполняться метод
    FSub.Params.Item(0).Value := 10//Значение первого параметра
    FSub.Params.Item(1).Value := 20//Значение второго параметра
    FSub.Invoke(); //Выполняем метод
    v := FSub.ResultValue; //Получаем результат выполнения
    //...

См.также:

Введение