В этой статье:

Раннее связывание

Позднее связывание

Использование сборки ForeNet

Использование класса System.Reflection.Assembly

Раннее и позднее связывание

Термины раннего и позднего связывания используются в различных языках программирования для описания действий, происходящих на этапе компиляции и на этапе исполнения приложения соответственно. Данные термины также актуальны для языка Fore.NET.

Раннее связывание

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

  1. Подключить необходимую сборку по ссылке в навигаторе проекта:

  2. В коде модуля/формы разрабатываемой .NET-сборки прописать директиву Imports для импорта типов подключенной сборки. Это позволит в дальнейшем использовать неквалифицированные идентификаторы для доступа к типам.

После этого весь код по обращение к ресурсам подключенной сборки будет проверяться на этапе компиляции .NET-сборки.

Позднее связывание

Позднее связывание означает, что обращение к объекту и вызов его метода будут связаны только во время выполнения Fore.NET-сборки. Динамическая загрузка сборок и позднее связывание реализуются c использованием ресурсов сборки ForeNet.

Использование сборки ForeNet

Рассмотрим пример динамической загрузки и использования .NET-сборки репозитория. Реализация примеров производится в точке входа .NET-сборки.

Для выполнения примера предполагается наличие .NET-сборки с идентификатором «Assembly_1». Данная сборка имеет пространство имен по умолчанию с наименованием «TestObjects». Также в одном из модулей сборки реализован общий (Public) класс «Test» имеющий общий метод «TestFunction». Метод имеет один целочисленный параметр. К разрабатываемой сборке необходимо подключить системные сборки репозитория ForeNet и Metabase.

Imports Prognoz.Platform.Interop.ForeNet;
Imports Prognoz.Platform.Interop.Metabase;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    fasmClass: ForeNETAssemblyClassClass;
    asm: IForeNETAssembly;
    run: IForeNetRuntime;
    runAsm: IForeNetRuntimeAssembly;
    clsType: IForeNETRuntimeType;
    objClass: IForeNETRuntimeObjectInstance;
    result: Object;
Begin
    mb := Params.Metabase;
    fasmClass := New ForeNETAssemblyClassClass();
    run := fasmClass.Runtime;
    //Получение объекта репозитория - .NET-сборка
    asm := mb.ItemById["Assembly_1"].Bind() As IForeNETAssembly;
    //Получение контекста .NET-сборки для работы с тем, что в ней реализовано
    runAsm := run.Assembly[asm, Null];
    //Получение типа из .NET-сборки
    clsType := runAsm.Type["TestObjects.Test"]; //Указывается полностью квалифицированное имя класса
    //Получение экземпляра объекта
    objClass := clsType.CreateInstance(NullNull);
    //Выполнение метода у экземпляра объекта с указанным значением параметра
    result := objClass.InvokeMethod("TestFunction"10);
End Sub;

При выполнении примера будут произведены следующие действия:

  1. Динамически будет загружена .NET-сборка репозитория.

  2. Будет получена информация о классе «Test», создан экземпляр этого класса.

  3. Для созданного экземпляра объекта будет выполнен метод «TestFunction» и получен результат его выполнения.

Использование класса System.Reflection.Assembly

Для работы с загруженными .NET-сборками также можно использовать свойства и методы класса System.Reflection.Assembly (mscorlib.dll). Для приведение .NET-сборки к классу System.Reflection.Assembly необходимо:

  1. Контекст загруженной сборки, описываемый интерфейсом IForeNETRuntimeAssembly, преобразовать к объекту используя метод AsObject (Метод доступен только в Fore.NET). Метод вернет объект, описываемый интерфейсом IForeNETRuntimeObjectInstance.

  2. Полученный объект преобразовать с помощью метода IForeNETRuntime.ObjectToVariant.

  3. Полученное значение привести к классу System.Reflection.Assembly.

Рассмотрим работу с .NET-сборкой через класса System.Reflection.Assembly. Для выполнения примера необходимо соблюдение требований, указанных для примера выше.

Imports Prognoz.Platform.Interop.ForeNet;
Imports Prognoz.Platform.Interop.Metabase;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    fasmClass: ForeNETAssemblyClassClass;
    asm: IForeNETAssembly;
    run: IForeNetRuntime;
    runAsm: IForeNetRuntimeAssembly;
    refAsm: System.Reflection.Assembly;
    clsType: System.Type;
    objClass, result: Object;
    objMethod: MethodInfo;
Begin
    mb := Params.Metabase;
    fasmClass := New ForeNETAssemblyClassClass();
    run := fasmClass.Runtime;
    //Получение объекта репозитория - .NET-сборка
    asm := mb.ItemById["Assembly_1"].Bind() As IForeNETAssembly;
    //Получение контекста .NET-сборки для работы с тем, что в ней реализовано
    runAsm := run.Assembly[asm, Null];
    //Приведение к типу System.Reflection.Assembly
    refAsm := run.ObjectToVariant(runasm.AsObject()) As System.Reflection.Assembly;
    //Получение типа из .NET-сборки
    clsType := refAsm.GetType("TestObjects.Test"); //Полностью квалифицированное имя класса
    //Получение метод
    objMethod := clsType.GetMethod("TestFunction");
    //Создание экземпляра объекта
    objClass := refAsm.CreateInstance("TestObjects.Test");
    //Выполнение метода у экземпляра объекта с указанным значением параметра
    result := objMethod.Invoke(objClass, New Object[1] = [10]);
End Sub;

Результат выполнения метода совпадает с результатом примера выше указанного примера.

См. также:

Использование Fore.NET в продукте «Форсайт. Аналитическая платформа»