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

В коде модуля/формы разрабатываемой .NET-сборки прописать директиву Imports для импорта типов подключенной сборки. Это позволит в дальнейшем использовать неквалифицированные идентификаторы для доступа к типам.
После этого весь код по обращение к ресурсам подключенной сборки будет проверяться на этапе компиляции .NET-сборки.
Позднее связывание означает, что обращение к объекту и вызов его метода будут связаны только во время выполнения Fore.NET-сборки. Динамическая загрузка сборок и позднее связывание реализуются c использованием ресурсов сборки 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(Null, Null);
//Выполнение метода у экземпляра объекта с указанным значением
параметра
result := objClass.InvokeMethod("TestFunction", 10);
End Sub;
При выполнении примера будут произведены следующие действия:
Динамически будет загружена .NET-сборка репозитория.
Будет получена информация о классе «Test», создан экземпляр этого класса.
Для созданного экземпляра объекта будет выполнен метод «TestFunction» и получен результат его выполнения.
Для работы с загруженными .NET-сборками также можно использовать свойства и методы класса System.Reflection.Assembly (mscorlib.dll). Для приведение .NET-сборки к классу System.Reflection.Assembly необходимо:
Контекст загруженной сборки, описываемый интерфейсом IForeNETRuntimeAssembly, преобразовать к объекту используя метод AsObject (Метод доступен только в Fore.NET). Метод вернет объект, описываемый интерфейсом IForeNETRuntimeObjectInstance.
Полученный объект преобразовать с помощью метода IForeNETRuntime.ObjectToVariant.
Полученное значение привести к классу 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 в продукте «Форсайт. Аналитическая платформа»