IForeNETRuntimeObjectInstance.InvokeMethod

Синтаксис

InvokeMethod(Name: String; Args: Array): Variant;

Параметры

Name. Наименование члена типа, который необходимо выполнить.

Args. Значения параметров члена типа, используемые при выполнении. Значения можно передавать в виде массива, либо перечислить используя разделитель «,».

Описание

Метод InvokeMethod осуществляет выполнение члена типа и возвращает результат выполнения.

Комментарии

Результат выполнения .NET-метода будет помещен в переменную типа Variant. Если результатом выполнения является объект .NET-типа, то для дальнейшей работы с ним необходимо использовать метод VariantToObject.

В виду ограничений реализации данный метод не позволяет выполнять .NET-методы, результатом выполнения которых является какая-либо структура. Для выполнения таких .NET-методов используйте IForeNETRuntimeMethod.Invoke.

В качестве значений параметров, указываемых в Args, необходимо передавать массив параметров простых типов. При необходимости выполнить .NET-метод, имеющий параметры сложных типов, также необходимо использовать метод IForeNETRuntimeMethod.Invoke.

Пример

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

Imports System;
Imports System.Text;
Imports System.IO;
Imports System.Security.Cryptography;

Public Class RijndaelSample
    Public Sub EncryptData(Path, Data: String);
    Var
        DataFile, Key, IV: FileStream;
        RijndaelAlg: Rijndael;
        KeyArr, IVArr: Array Of byte;
        CrStr: CryptoStream;
        sWriter: StreamWriter;
    Begin
        DataFile := File.Open(Path + "CodedFile.txt", FileMode.OpenOrCreate);
        Key := File.Open(Path + "Key.txt", FileMode.OpenOrCreate);
        IV := File.Open(Path + "IY.txt", FileMode.OpenOrCreate);
        RijndaelAlg := Rijndael.Create;
        KeyArr := RijndaelAlg.Key;
        IVArr := RijndaelAlg.IV;
        //Создание экземпляра кодировщика
        CrStr := New CryptoStream(DataFile, RijndaelAlg.CreateEncryptor(KeyArr, IVArr), CryptoStreamMode.Write);
        sWriter := New StreamWriter(CrStr);
        sWriter.WriteLine(Data);
        sWriter.Close;
        //Сохранение секретного ключа
        sWriter := New StreamWriter(Key);
        sWriter.WriteLine(Convert.ToBase64String(KeyArr));
        sWriter.Close;
        //Сохранение вектора инициализации
        sWriter := New StreamWriter(IV);
        sWriter.WriteLine(Convert.ToBase64String(IVArr));
        sWriter.Close;
        //Закрытие потоков
        CrStr.Close;
        DataFile.Close;
        Key.Close;
        IV.Close;
    End Sub EncryptData;
    
    Public Function DecryptData(Path: String): String;
    Var
        KeyArr, IVArr: Array Of byte;
        RijndaelAlg: Rijndael;
        CrStr: CryptoStream;
        DataFile, Key, IV: FileStream;
        sReader: StreamReader;
        s: string;
    Begin
        DataFile := File.Open(Path + "CodedFile.txt", FileMode.Open);
        Key := File.Open(Path + "Key.txt", FileMode.Open);
        IV := File.Open(Path + "IY.txt", FileMode.Open);
        //Загрузка секретного ключа
        sReader := New StreamReader(Key);
        s := sReader.ReadLine;
        KeyArr := Convert.FromBase64String(s);
        //Загрузка вектора инициализации
        sReader := New StreamReader(IV);
        s := sReader.ReadLine;
        IVArr := Convert.FromBase64String(s);
        RijndaelAlg := Rijndael.Create;
        //Создание экземпляра декодировщика
        CrStr := New CryptoStream(DataFile, RijndaelAlg.CreateDecryptor(KeyArr, IVArr), CryptoStreamMode.Read);
        sReader := New StreamReader(CrStr);
        //Декодирование данных
        s := sReader.ReadLine;
        sReader.Close;
        //Закрытие потоков
        CrStr.Close;
        DataFile.Close;
        Key.Close;
        IV.Close;
        Return s;
    End Function DecryptData;

End Class RijndaelSample;

В классе RijndaelSample реализованы процедура и функция. Процедура EncryptData осуществляет кодирование, а функция DecryptData - декодирование с помощью алгоритма симметричного шифрования Rijndael. Результатом работы процедуры EncryptData являются три файла, содержащих закодированные данные, секретный ключ и вектор инициализации. Файлы будут сохранены в папку, указанную в параметре Path метода. Результатом работы функции DecryptData является декодированный текст.

Использования данного класса для шифрования и дешифрования данных в Fore рассмотрим на следующем примере. Для выполнения примера предполагается наличие формы, и расположенных на ней, двух кнопок с наименованиями «Button1» и «Button2». В файловой системе имеется папка «C:\Work».

Class TestForm: Form
    Button1: Button;
    Button2: Button;

    Sub Button1OnClick(Sender: Object; Args: IMouseEventArgs);
    Var
        MB: IMetabase;
        Run: IForeNETRuntime;
        NetAsm: IForeNETAssembly;
        Asm: IForeNETRuntimeAssembly;
        Typ: IForeNETRuntimeType;
        ObjInst: IForeNETRuntimeObjectInstance;
        v: Array;
    Begin
        MB := MetabaseClass.Active;
        Run := ForeNETAssemblyClass.Runtime;
        NetAsm := MB.ItemById("NETAssembly_1").Bind As IForeNETAssembly;
        //Получение сборки
        Asm := Run.Assembly(NetAsm);
        //Получение типа
        Typ := Asm.Type("RijndaelSample");
        //Вызов конструктора без параметров для типа
        ObjInst := Typ.CreateInstance;
        //Создание массива параметров для выполнения члена типа
        v := New Variant[2];
        v[0] := "C:\Work\";
        v[1] := "Тестовый текст для шифрования";
        //Выполнение члена типа
        ObjInst.InvokeMethod("EncryptData", v);
    End Sub Button1OnClick;
    
    Sub Button2OnClick(Sender: Object; Args: IMouseEventArgs);
    Var
        MB: IMetabase;
        Run: IForeNETRuntime;
        NetAsm: IForeNETAssembly;
        Asm: IForeNETRuntimeAssembly;
        Typ: IForeNETRuntimeType;
        ObjInst: IForeNETRuntimeObjectInstance;
        s: String;
    Begin
        MB := MetabaseClass.Active;
        Run := ForeNETAssemblyClass.Runtime;
        NetAsm := MB.ItemById("NETAssembly_1").Bind As IForeNETAssembly;
        //Получение сборки
        Asm := Run.Assembly(NetAsm);
        //Получение типа
        Typ := Asm.Type("RijndaelSample");
        //Вызов конструктора без параметров для типа
        ObjInst := Typ.CreateInstance;
        //Выполнение члена типа
        s := ObjInst.InvokeMethod("DecryptData""C:\Work\");
        Debug.WriteLine(s);
    End Sub Button2OnClick;
End Class TestForm;

При нажатии на кнопку «Button1» будет осуществлен вызов процедуры «EncryptText» класса «RijndaelSample». При работе данной процедуры в папке «C:\Work\» будут созданы три файла: CodedFile.txt, Key.txt и IY.txt. Данные файлы будут содержать кодированные данные, секретный ключ и значение вектора инициализации соответственно. При нажатии кнопку «Button2» будет осуществлен вызов функции «DecryptText». При работе данной функции будет осуществлено декодирование содержимого файла «CodedFile.txt». Значения секретного ключа и вектора инициализации, необходимые для работы алгоритма Rijndael, будут взяты из файлов «Key.txt» и «IY.txt». Результат декодирования будет выведен в консоль среды разработки.

См. также:

IForeNETRuntimeObjectInstance