При разработке приложений, использующих несколько сборок MATLAB ® .NET, необходимо учитывать, что следующие компоненты не могут совместно использоваться сборками:
Дескрипторы функций MATLAB
Ручки фигур MATLAB
Объекты MATLAB
Объекты C, Java ® и .NET
Исполняемые данные, хранящиеся в массивах и структурах ячеек
Дескрипторы функций MATLAB могут передаваться между приложением и экземпляром MATLAB Runtime, из которого он был создан. Однако дескриптор функции MATLAB не может быть передан в экземпляр среды выполнения MATLAB, отличный от того, в котором он был создан. Например, предположим, что у вас было две функции MATLAB, get_plot_handle и plot_xy, и plot_xy использовал дескриптор функции, созданный get_plot_handle.
% Saved as get_plot_handle.m function h = get_plot_handle(lnSpec, lnWidth, mkEdge, mkFace, mkSize) h = @draw_plot; function draw_plot(x, y) plot(x, y, lnSpec, ... 'LineWidth', lnWidth, ... 'MarkerEdgeColor', mkEdge, ... 'MarkerFaceColor', mkFace, ... 'MarkerSize', mkSize) end end
% Saved as plot_xy.m function plot_xy(x, y, h) h(x, y); end
Если вы скомпилировали их в две общие библиотеки, вызов plot_xy вызовет исключение.
using System;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using get_plot_handle;
using plot_xy;
namespace MathWorks.Examples.PlotApp
{
class PlotCSApp
{
static void Main(string[] args)
{
try
{
// Create objects for the generated functions
get_plot_handle.Class1 plotter=
new get_plot_handle.Class1();
plot_xy.Class1 plot = new plot_xy.Class1();
MWArray h = plotter.get_plot_handle('--rs', (double)2,
'k','g', (double)10);
double[] x_data = {1,2,3,4,5,6,7,8,9};
double[] y_data = {2,6,12,20,30,42,56,72,90};
MWArray x = new MWArray(x_data);
MWArray y = new MWArray(y_data);
plot.plot_xy(x, y, h);
}
catch(Exception exception)
{
Console.WriteLine("Error: {0}", exception);
}
}
}
}
Правильный способ справиться с ситуацией - скомпилировать обе функции в одну сборку.
using System;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using plot_functions;
namespace MathWorks.Examples.PlotApp
{
class PlotCSApp
{
static void Main(string[] args)
{
try
{
// Create object for the generated functions
Class1 plot= new Class1();
MWArray h = plot.get_plot_handle('--rs', (double)2,
'k','g', (double)10);
double[] x_data = {1,2,3,4,5,6,7,8,9};
double[] y_data = {2,6,12,20,30,42,56,72,90};
MWArray x = new MWArray(x_data);
MWArray y = new MWArray(y_data);
plot.plot_xy(x, y, h);
}
catch(Exception exception)
{
Console.WriteLine("Error: {0}", exception);
}
}
}
}
SDK™ компилятора MATLAB позволяет возвращать следующие типы объектов из среды выполнения MATLAB в код приложения:
MATLAB
C++
.NET
Ява
Однако невозможно передать объект, созданный в одном экземпляре среды выполнения MATLAB, в другой экземпляр среды выполнения MATLAB. Этот конфликт может возникнуть, когда функция, возвращающая объект, и функция, управляющая этим объектом, компилируются в различные сборки.
Например, необходимо разработать две функции. Первый создает банковский счет для клиента на основе некоторого набора условий. Второй переводит средства между двумя счетами.
% Saved as account.m classdef account < handle properties name end properties (SetAccess = protected) balance = 0 number end methods function obj = account(name) obj.name = name; obj.number = round(rand * 1000); end function deposit(obj, deposit) new_bal = obj.balance + deposit; obj.balance = new_bal; end function withdraw(obj, withdrawl) new_bal = obj.balance - withdrawl; obj.balance = new_bal; end end end
% Saved as open_acct .m function acct = open_acct(name, open_bal ) acct = account(name); if open_bal > 0 acct.deposit(open_bal); end end
% Saved as transfer.m function transfer(source, dest, amount) if (source.balance > amount) dest.deposit(amount); source.withdraw(amount); end end
При компиляции open_acct.m и transfer.m в отдельные монтажные узлы, невозможно перевести средства с использованием счетов, созданных с помощью open_acct. Вызов transfer выбрасывает исключение. Одним из способов решения этой проблемы является компиляция обеих функций в одну сборку. Можно также переформатировать приложение так, чтобы объекты MATLAB не передавались функциям.