Чтобы динамически вызвать функции 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#.