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

Для использования ресурсов .NET-объектов в модулях/формах, написанных на языке Fore, в данной сборке реализован ряд интерфейсов. Для того чтобы понять общий принцип работы с .NET-объектами введем ряд определений:

Вся работа с .NET-объектами осуществляется в рамках контекста текущего запущенного приложения «Форсайт. Аналитическая платформа». Для получения контекста приложения используется статическое свойство IForeNETAssemblyClass.Runtime.

Var
    Run: IForeNETRuntime;
Begin
    Run := ForeNETAssemblyClass.Runtime;

Получив контекст приложения можно получить доступ к любым .NET-сборкам репозитория, либо к системным сборка зарегистрированным в GAC или хранящимся в виде внешних файлов DLL.

Доступ к .NET-сборкам репозитория:

Var
    MB: IMetabase;
    Run: IForeNETRuntime;
    Asm: IForeNETRuntimeAssembly;
Begin
    MB := MetabaseClass.Active;
    Run := ForeNETAssemblyClass.Runtime;
    Asm := Run.Assembly(MB.ItemById("NetAssembly_1").Bind As IForeNETAssembly);

Доступ к системным сборкам, зарегистрированным в GAC:

Var
    Run: IForeNETRuntime;
    Asm1: IForeNETRuntimeAssembly;
Begin
    Run := ForeNETAssemblyClass.Runtime;
    Asm1 := Run.SystemAssembly("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

Доступ к .NET-сборкам, реализованным в отдельных DLL-файлах:

Var
    Run: IForeNETRuntime;
    Asm2: IForeNETRuntimeAssembly;
Begin
    Run := ForeNETAssemblyClass.Runtime;
    Asm2 := Run.SystemAssembly("file:///C:\Work\UserFunc.dll");

Получив доступ к .NET-сборке можно работать со всеми её типами. Если работа осуществляется с .NET-сборкой репозитория, то через её контекст можно получить контекст любой .NET-формы, реализованной в этой сборке:

Var
    //...
    Asm: IForeNETRuntimeAssembly;
    NetForm: IForeNETRuntimeForm;
Begin
    //...
    NetForm := Asm.Form("NetAssembly_1.MainForm");
    NetForm.Show;

Доступ к типам .NET-сборок:

Var
    //...
    Asm, Asm1, Asm2: IForeNETRuntimeAssembly;
    Type, Type1, Type2: IForeNETRuntimeType;
Begin
    //...
    Type := Asm.Type("NetAssembly_1.UserObject");
    Type1 := Asm1.Type("System.Windows.Forms.Cursors");
    Type2 := Asm2.Type("UserFunc.ClassFunc");

Примечание. Переменные Asm, Asm1, Asm2 соответствуют переменным из примеров выше. В .NET-сборке репозитория предполагается наличие класса UserObject; в коде .NET-сборки, реализованной в UserFunc.dll, - класса ClassFunc.

Имея какой-либо .NET-тип для дальнейшей работы можно создать экземпляр объекта для данного типа. Для создания экземпляров объектов предназначены два метода: IForeNETRuntimeType.CreateInstance и IForeNETRuntimeType.CreateInstanceVar. Данные методы осуществляют поиск и выполнение конструктора .NET-типа. В зависимости от сигнатуры конструктора, используемого для создания экземпляра объекта, в данных методах могут понадобится дополнительные параметры. Конструкторы .NET-типов могут отличаться незначительно: различные типы параметров, количество параметров. CreateInstance используется, если однозначно необходимо определить тип параметров конструктора и его значение. Его использование актуально, если параметры конструктора имеют какой-либо .NET-тип, не совместимый с Fore типами данных. Для создания дополнительных параметров данного метода используются методы IForeNETRuntime.CreateArgs и IForeNETRuntime.CreateBinding.

CreateInstanceVar - это частный случай метода CreateInstance. Данный метод используется, если параметры конструктора имеют простые типы, совместимые с типами данных Fore.

Var
    //...
    Type: IForeNETRuntimeType;
    TypeInst: IForeNETRuntimeObjectInstance;
Begin
    //...
    TypeInst := Type.CreateInstance;

Имея экземпляр объекта можно осуществлять различные действия с ним, выполнять для него какие-либо .NET-методы, передавать в качестве параметра для других .NET-методов и т.п.

Для выполнения .NET-методов реализован ряд методов в Fore:

Примеры использования методов приведены в их описании.

См.также:

Введение