Чтобы динамически вызвать функции MATLAB®, задайте имя функции как один из параметров к методу, вызывающему запрос. Вы не должны создавать скомпилированный интерфейс, который моделирует содержимое развертываемого архива, и при этом вы не должны изменять свое клиентское приложение, если существуют изменения в функциях в развертываемом архиве.
Динамически вызвать функцию MATLAB:
Инстанцируйте экземпляра MWClient.
Создайте основанный на отражении объект прокси с помощью одного из методов CreateComponentProxy() клиентской связи.
Вызовите функцию или функции, с помощью одного из методов 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);
Динамический прокси имеет три метода для вызова функций на сервере:
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.
Обеспечить маршалинг управляет к прокси:
Реализуйте новый набор маршалинга правил путем расширения MWDefaultMarshalingRules, чтобы заменить значения по умолчанию.
Создайте прокси с помощью 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#.