Fore, Fore.NET, .NET и как все это связано между собой

Блог Форсайт
Филипп Пономарев

Согласно исследованиям TIOBE, язык C# занимает почетное 5-е место в рейтинге языков программирования. Для того чтобы снизить порог вхождения для разработки под Prognoz Platform, позволить разработчикам .NET использовать собственные наработки и обширную библиотеку классов .NET Framework Class Library и, наоборот, позволить использовать решения Prognoz Platform в рамках .NET проектов, было решено разработать язык программирования Fore.NET.

В данной статье я хочу сфокусировать ваше внимание на некоторых особенностях .NET, Fore.NET и двусторонней интеграции с Fore.

Что это — Fore.NET?

Подробное определение .NET Framework можно найти в Википедии, мы не будем на этом подробно останавливаться, однако отметим следующие наиважнейшие моменты, также доступные в Fore.NET:

1. В .NET Framework есть обширная библиотека классов Framework Class Library (FCL), которую также можно использовать в Fore.NET.

2. Программы, написанные на .NET Framework, совместимы друг с другом, т.к. оттранслированы в Common Intermediate Language и выполняются в одной и той же исполняющей среде, таким образом, как к программам, написанным на Fore.NET, можно подключать любые другие библиотеки, написанные на .NET, так и наоборот.

Исходя из предпосылок создания и опираясь на особенности .NET Framework, в Prognoz Platform был разработан язык программирования Fore.NET, в его состав входит транслятор программного кода в байт-коды MSIL, среда разработки со встроенным дизайнером форм, разработаны различные инструменты интеграции с инструментами Prognoz Platform.

Архитектура сборок Fore.NET крайне схожа с архитектурой сборок языка Fore. Fore.NET сборка может в себя включать Fore.NET модули и формы. Стоит обратить внимание, что синтаксис Fore.NET максимально схож с синтаксисом языка Fore.

Как уже было сказано выше, Fore.NET транслирует код в байт-коды, выполняемые в среде CLR. Результатом такой трансформации является сборка, уже выполняемая средой CLR.

Использование системных сборок Fore в Fore.NET

Новый язык программирования, позволяющий использовать свежие IT-решения, безусловно, крутая штука, однако его целесообразность сильно теряется при невозможности интегрирования с остальными решениями Prognoz Platform. Начиная с этого момента мы перейдем непосредственно к различным интеграционным решениям и практическим выкладкам.

Ядро Prognoz Platform состоит из COM библиотек, а системные сборки строятся на основании библиотек типов. Fore.NET, в свою очередь, базируется на .NET и для корректной работы с объектами ядра используется технология COM Interop: системные сборки Fore.NET представляют собой сборки общеязыковой среды выполнения (CLR) после выполнения экспорта из библиотек типов системных сборок посредством tlbimp.exe, подробнее о процессе получения сборок CLR можно почитать на MSDN. Системные сборки Fore.NET имеют вид Prognoz.Platform.Interop.SourceDllName.dll.

Также важно отметить, что т.к. Fore.NET выполняется в CLR, он полностью поддерживает как подключение всех библиотек FCL, так и любых написанных под .NET библиотек.

Для подключения сборок из GAC можно использовать вкладку «.NET сборки». При отсутствии сборки в GAC и необходимости использования этой сборки в рамках Prognoz Platform, такую внешнюю сборку можно загрузить непосредственно в метабазу. Для этого необходимо использовать опцию «Загрузить внешнюю сборку»:

Fore <-> Fore.NET

Теперь прейдем непосредственно к самому главному в этой статье – интеграции Fore с Fore.NET и наоборот.

Чтобы не терять функционал, написанный ранее, Fore.NET имеет возможность вызова Fore методов. Далее будут рассмотрены примеры динамического вызова функций Fore.NET из Fore и наоборот, это поможет сохранить наработки на Fore, продолжая разработку на Fore.NET, или же из Fore вызывать методы из .NET библиотек, например, из Framework Class Library, посредством Fore.NET.

Рассмотрим первую часть примера. Создадим Fore-форму в рамках Fore-сборки и Fore.NET-форму в рамках Fore.NET-сборки. У полученной Fore-сборки идентификатор «FORE_ASSEMBLY», а у Fore.NET-сборки – «FORE_NET_ASSEMBLY», это нам пригодится для дальнейших манипуляций.

В Fore-форму добавим программный код, включающий в себя описание класса, который мы будем вызывать в дальнейшем динамически, а также динамический вызов Fore.NET (ниже будет рассказано более подробно):

Public Class ForeSource : object Public Function getText : string; Begin WinAPrognoz Platformlication.InformationBox("HelloFrom Fore"); Return "Fore exceution done!"; End Function getText; End Class ForeSource; Class FFormForm: Form bFNCaller: Button; Sub bFNCallerOnClick(Sender: Object; Args: IMouseEventArgs); Var netRuntime : IForeNETRuntime; netRuntimeAssembly : IForeNETRuntimeAssembly; netRuntimeObjectInstance : IForeNETRuntimeObjectInstance; netRuntimeType : IForeNETRuntimeType; netResult : Variant; Begin netRuntime := ForeNETAssemblyClass.Runtime; netRuntimeAssembly:=netRuntime.Assembly(MetabaseClass.Active.ItemById("FORE_NET_ASSEMBLY").Bind As IForeNETAssembly); netRuntimeType:=netRuntimeAssembly.Type("FORE_NET_ASSEMBLY.ForeNetSource"); netRuntimeObjectInstance:=netRuntimeType.CreateInstance; netResult := netRuntimeType.InvokeMethod("getText", netRuntimeObjectInstance, New variant[0]); Text := netResult As String; End Sub bFNCallerOnClick; End Class FFormForm;

Для того чтобы наша Fore-форма в дальнейшем корректно заработала, не забудем к ней подключить сборки «Metabase», «Ui» и «ForeNET».

Визуально форма выглядит следующим образом:

Таким образом, подготовительные действия с Fore завершены.

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

Imports System; Imports Prognoz.Platform.Interop.Metabase; Public Class StartParams Private m_Metabase: Prognoz.Platform.Interop.Metabase.IMetabase; Public Property Metabase: Prognoz.Platform.Interop.Metabase.IMetabase Get Begin Return m_Metabase End Get Set Begin m_Metabase := Value; End Set End Property Metabase; End Class; Public Class Program [STAThread] Public Shared Sub Main(Params: StartParams); Var f:FORE_NET_FORM; Begin f:= New FORE_NET_FORM.FORE_NET_FORM(Params); f.ShowDialog(); End Sub; End Class;

Теперь добавим следующий программный код в Fore.NET-форму, включающий в себя описание класса, который мы будем вызывать в дальнейшем динамически, а также динамический вызов Fore (ниже будет рассказано более подробно):

Imports Prognoz.Platform.Forms.Net; Imports Prognoz.Platform.Interop.Fore; Imports Prognoz.Platform.Interop.Metabase; Public Partial Class FORE_NET_FORM: Prognoz.Platform.Forms.Net.ForeNetForm Mb: IMetabase; Public Constructor FORE_NET_FORM(); Begin Mb := Null; InitializeComponent(); End Constructor; Public Constructor FORE_NET_FORM(Params: StartParams); Begin Mb := Params.Metabase; InitializeComponent(); End Constructor; Private Sub bCallFore_Click(sender: System.Object; e: System.EventArgs); Var services : IForeServices; runtime : IForeRuntime; assembly : IForeAssembly; foreSub : IForeSub; foreClass : IForeClass; foreObject : IForeObject; Begin If Mb <> Null Then services := Mb As IForeServices; runtime := services.GetRuntime(); runtime.LoadAssembly("FORE_ASSEMBLY"); assembly := runtime.BindToAssembly("FORE_ASSEMBLY"); foreClass := assembly.BindToClass("ForeSource"); foreObject := foreClass.CreateObject(); foreSub := foreClass.BindToMethod("getText"); foreSub.Self := foreObject; foreSub.Invoke(); If foresub.IsResult Then Text := foreSub.ResultValue As string; End If; End If; End Sub; End Class; Public Class ForeNetSource:object Public Function getText():string; Begin System.Windows.Forms.MessageBox.Show("HelloFrom Fore.NET"); Return "Fore.NET exceution done!"; End Function getText; End Class ForeNetSource;

Теперь для того чтобы Fore.NET-форма корректно открывалась, укажем точку входа Fore.NET-сборки — Program:

Fore -> Fore.NET

В следующей части программного кода Fore.NET-формы в классе ForeNetSource имеется метод, возвращающий строку и показывающий стандартный MessageBox сборки Windows.Forms, именно этот метод мы и будем вызывать из Fore:

Public Class ForeNetSource:object Public Function getText():string; Begin System.Windows.Forms.MessageBox.Show("HelloFrom Fore.NET"); Return "Fore.NET exceution done!"; End Function getText; End Class ForeNetSource; Теперь рассмотрим непосредственно вызов этого метода с комментариями: netRuntime := ForeNETAssemblyClass.Runtime; // Получаем Runtime, в котором мы сможем выполнять NET код netRuntimeAssembly:=netRuntime.Assembly(MetabaseClass.Active.ItemById("FORE_NET_ASSEMBLY").Bind As IForeNETAssembly); // Компилируем и загружаем нашу Fore.NET-сборку netRuntimeType:=netRuntimeAssembly.Type("FORE_NET_ASSEMBLY.ForeNetSource"); // Получаем тип «FORE_NET_ASSEMBLY.ForeNetSource» netRuntimeObjectInstance:=netRuntimeType.CreateInstance; // Создаем экземпляр этого типа netResult := netRuntimeType.InvokeMethod("getText", netRuntimeObjectInstance, New variant[0]); // Вызываем метод «getText» у полученного ранее объекта Text := netResult As String; // Сохраняем результат в заголовок формы.

Давайте просмотрим, как все это работает:

Fore.NET -> Fore

Теперь рассмотрим вызов Fore из Fore.NET. Рассмотрим часть программного кода Fore-формы, в которой в классе ForeSource имеется метод, возвращающий строку и показывающий InformatonBox системной сборки Prognoz Platform «Ui», именно этот метод мы и будем вызывать из Fore.NET:

Public Class ForeSource : object Public Function getText:string; Begin WinAPrognoz Platformlication.InformationBox("HelloFrom Fore"); Return "Fore exceution done!"; End Function getText; End Class ForeSource;Рассмотрим часть программного кода Fore.NET-формы, отвечающей за вызов Fore-метода с комментариями:

Убедимся, что вызов метода работает:

Стоит обратить внимание, что такая динамическая работа с объектами Fore и Fore.NET может происходить и в рамках одного языка – мы можем как создавать Fore-объекты и вызывать Fore-методы из Fore, так и тоже самое в Fore.NET из Fore.NET.

Заключение

Мы с вами посмотрели на предпосылки создания языка программирования Prognoz Platform Fore.NET, посмотрели некоторые технические особенности .NET, убедились в доступности системных библиотек Fore в Fore.NET, а самое главное – убедились в двусторонней интеграции Fore и Fore.NET.

Комментарии

Email не будет опубликован.
Подробнее о политике использования персональных данных