Вызовите MATLAB Functions Dynamically

Чтобы динамически вызвать функции MATLAB®, задайте имя функции как один из параметров к методу, вызывающему запрос. Вы не должны создавать скомпилированный интерфейс, который моделирует содержимое развертываемого архива, и при этом вы не должны изменять свое клиентское приложение, если существуют изменения в функциях в развертываемом архиве.

Динамически вызвать функцию MATLAB:

  1. Инстанцируйте экземпляра MWClient.

  2. Создайте основанный на отражении объект прокси с помощью одного из методов CreateComponentProxy() клиентской связи.

  3. Вызовите функцию или функции, с помощью одного из методов Invoke() основанного на отражении прокси.

Создайте основанного на отражении прокси

Основанный на отражении прокси реализует интерфейс MWInvokable и предоставляет методы, которые позволяют вам, непосредственно вызывают любую функцию MATLAB, развернутую как часть развертываемого архива. Как с основанным на интерфейсе прокси, основанный на отражении прокси создается из объекта MWClient. Интерфейс MWClient имеет два метода для создания основанного на отражении прокси:

  • MWInvokable CreateComponentProxy(URL archiveURL) создает прокси, который использует стандартные типы данных MATLAB.

  • MWInvokable CreateComponentProxy(URL archiveURL, MWMarshallingRules marshallingRules) создает прокси, который использует структуры.

Создать основанного на отражении прокси для вызова функций в архиве myMagic, размещенном на вашем локальном компьютере:

MWClient myClient = new MWHttpClient();

Uri archiveURL = new Uri("http://localhost:9910/myMagic");
MWInvokable myProxy =  myClient.CreateComponentProxy(archiveURL);

Вызовите функцию MATLAB с динамическим прокси

Динамический прокси имеет три метода для вызова функций на сервере:

  • Object[] Invoke(string functionName, IList<Type> targetTypes, params Object[] inputs) вызывает функцию, которая возвращает несколько значений.

  • T Invoke<T>(string functionName, params Object[] inputs) вызывает функции, который возвращает одно значение.

  • void Invoke(string functionName, params Object[] inputs) вызывает функцию, которая не возвращает значений.

Все методы сопоставляют с функцией MATLAB можно следующим образом:

  • Первый аргумент является именем функции

  • Последние аргументы являются входными параметрами функции

Возвратите несколько выходных параметров

Функция MATLAB myLimits возвращает два значения.

function [myMin,myMax] = myLimits(myRange)
 myMin = min(myRange);
 myMax = max(myRange);
end

Чтобы вызвать myLimits от клиента.NET, используйте метод Invoke(), который берет список целевых типов:

double[] myRange = new double[]{2,5,7,100,0.5};
IList<Type> targetTypes = 
    new List<Type> { typeof(double), typeof(double) };
Object[] myLimits = myProxy.Invoke("myLimits", targetTypes, myRange);
double myMin = myLimits[0];
double myMax = myLimits[1];
Console.WriteLine("min: {0:f} max: {1:f}", myMin, myMax);

Эта форма Invoke() всегда возвращает Object[]. Содержимое возвращенного массива вводится на основе содержимого targetType.

Возвратите один выходной параметр

Функция MATLAB addmatrix возвращает одно значение.

function a = addmatrix(a1, a2)
a = a1 + a2;

Чтобы вызвать addmatrix от клиента.NET, используйте метод Invoke(), который не берет количество возвращаемых аргументов:

double[,] a1 = new double[,] {{1,2,3},{3,2,1}};
double[,] a2 = new double[,] {{4,5,6},{6,5,4}};
Object[] inputs = new Object[2];
inputs[0] = a1;
inputs[1] = a2;
double[,] result = myProxy.Invoke<double[,]>("addmatrix", inputs);

// display the result

Не возвратите выходные параметры

Функция MATLAB foo не возвращает значение.

function foo(a1)
min(a1);

Чтобы вызвать foo от клиента.NET, используйте метод Invoke(), который возвращается пусто:

double[,] a = new double [,] {{1,2,3},{3,2,1}};
myProxy.Invoke("foo", a);

Создайте пользовательские правила маршалинга

Необходимо предоставить пользовательские правила маршалинга основанному на отражении прокси если:

  • любая функция MATLAB в развертываемом архиве использует структуры

  • любой MATLAB в развертываемом архиве требует пользовательской установки на правила маршалинга по умолчанию.

    Существуют правила по умолчанию, упорядочивающие NaN, DateTime, пустой указатель.NET, 1xN векторы и векторы Nx1.

Обеспечить маршалинг управляет к прокси:

  1. Реализуйте новый набор маршалинга правил путем расширения MWDefaultMarshalingRules, чтобы заменить значения по умолчанию.

  2. Создайте прокси с помощью CreateComponentProxy(URL archiveURL, MWMarshallingRules marshalingRules).

Развертываемый studentCheck архива включает функции, которые используют структуру MATLAB формы

S = 
name: 'Ed Plum'
score: 83
grade: 'B+'

Клиентский код представляет структуру MATLAB с классом под названием Student. Чтобы создать правило маршалинга для того, чтобы динамически вызвать функции в studentChecker, создайте класс под названием studentMarshaller.

class studentMarshaler : MWDefaultMarshalingRules
{
  public override IList<Type> StructTypes()
  {
    get { return new List<Type> { typeof(Student) }; }
  }
}

Создайте динамического прокси для studentCheck путем передачи studentMarshaller createComponentProxy().

URL archiveURL = new URL("http://localhost:9910/studentCheck");
myProxy =  myClient.CreateComponentProxy(archiveURL,
                                         new StudentMarshaler());

Для получения дополнительной информации об использовании структур MATLAB смотрите Маршала Структуры MATLAB (структуры) в C#.

Для получения дополнительной информации о других правилах маршалинга данных, смотрите Преобразование Данных с Типами MATLAB и C#.