Для использования ресурсов .NET-объектов в модулях/формах, написанных на языке Fore, в данной сборке реализован ряд интерфейсов. Для того чтобы понять общий принцип работы с .NET-объектами введем ряд определений:
Контекст - упорядоченный набор свойств, определяющий среду объекта. Контекст создается в результате активации объекта, и используется для работы с его ресурсами. В рамках одного контекста может существовать множество объектов.
.NET-сборка - основной строительный блок, на основе которого строится .NET-приложение. В рамках платформы .NET-сборка - это набор .NET-форм и .NET-модулей, которые компилируются как единое целое. Также в платформе доступно использование ресурсов .NET-сборок, зарегистрированных в GAC или загруженных из внешних файлов DLL. Для работы с ресурсами .NET-сборок предназначен интерфейс IForeNETRuntimeAssembly. Для получения контекста .NET-сборки используются свойства IForeNETRuntime.Assembly, либо IForeNETRuntime.SystemAssembly.
.NET-тип - класс, интерфейс, структура, перечислимый тип, либо делегат, реализованный в .NET-сборке. Для получения доступа к .NET-типу используется свойство IForeNETRuntimeAssembly.Type. Для работы с .NET-типом предназначен интерфейс IForeNETRuntimeType. Доступ к .NET-типу осуществляется по его квалифицированному имени. Для использования ресурсов .NET-типа необходимо создать его экземпляр. Для получения экземпляра .NET-типа используются методы IForeNETRuntimeType.CreateInstance, либо IForeNETRuntimeType.CreateInstanceVar.
.NET-метод - поля, процедуры, функции, события, а также соответствующие статические методы, реализованные в .NET-типе. Для получения доступа к .NET-методу используется свойство IForeNETRuntimeType.Method. Для работы с .NET-методом предназначен интерфейс IForeNETRuntimeMethod. Методы выполняются для экземпляров .NET-объектов. Для выполнения статических методов в качестве экземпляра объекта указывается значение Null.
Вся работа с .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:
IForeNETRuntimeObjectInstance.InvokeMethod - выполнение указанного .NET-метода для текущего экземпляра объекта.
IForeNETRuntimeType.InvokeMethod - выполнение указанного .NET-метода текущего .NET-типа для указанного экземпляра объекта. Также используется для выполнения статических .NET-методов.
IForeNETRuntimeMethod.Invoke - выполнение текущего .NET-метода для указанного экземпляра объекта. Также используется для выполнения статических .NET-методов.
Примеры использования методов приведены в их описании.
См.также: