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». Результат декодирования будет выведен в консоль среды разработки.
См. также: