Для использования ресурсов сборок/форм/модулей, написанных на языке Fore, в .NET-модулях/формах реализован ряд интерфейсов. Для работы с Fore-объектами необходимо на вкладке «.Net сборки» в окне настройки ссылок .NET-сборки подключить сборку «Prognoz.Platform.Interop.Fore». Для более удобного использования не квалифицированных идентификаторов в области импорта можно добавить строку для импорта содержимого пространства имен данной сборки:
Imports Prognoz.Platform.Interop.Fore;
Для работы с модулями/формами Fore используются следующие интерфейсы:
Интерфейс | Краткое описание |
IForeServices | Базовый интерфейс, содержащий свойства и методы для работы Fore-объектами платформы. |
IForeRuntime | Интерфейс, содержащий свойства и методы для работы с контекстом выполнения платформы. В данном контексте осуществляется работа со всеми сборками. |
IForeAssembly | Интерфейс, содержащий свойства и методы для работы с Fore-сборками. Отдельные модули и формы, не входящие в какую-либо сборку, компилируются как отдельная сборка и также реализуются данным интерфейсом. |
IForeClass | Интерфейс, содержащий свойства и методы для работы с Fore-типами,
реализованными в Fore-сборках. Некоторые свойства и методы интерфейса:
Примечание. В виду особенностей реализации, связанных с созданием экземпляров объектов с помощью метода CreateObject, полученный объект будет полностью соответствовать классу, но при инициализации не будут вызваны конструкторы класса: не вызывается конструктор по умолчанию или какие-либо конструкторы, реализованные в классе. В связи с этим полученный объект может иметь не те значения свойств/полей, которые предполагались логикой его работы. При необходимости конструктор может быть получен и вызван с помощью метода BindToMethod. |
IForeSub | Интерфейс, содержащий свойства и методы для работы с Fore-методами, реализованными в Fore-типах. |
IForeObject | Интерфейс, содержащий свойства и методы для работы с экземплярами
объектов Fore-типов. Некоторые свойства и методы интерфейса:
|
Примечание. Данные интерфейсы доступны только в языке Fore.NET, либо в языках где используется библиотека платформы Prognoz.Platform.Interop.Fore.dll.
Для выполнения примера предполагается наличие .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; //Получаем результат выполнения
//...
См.также: