单个应用程序中多个程序集的限制
在开发使用多个 MATLAB® .NET 程序集的应用程序时,请考虑以下内容不能在程序集之间共享:
MATLAB 函数句柄
MATLAB 图窗句柄
MATLAB 对象
C、Java® 和 .NET 对象
存储在元胞数组和结构中的可执行数据
使用 MATLAB 函数句柄
MATLAB 函数句柄可以在应用程序和它起源的 MATLAB Runtime 实例之间传递。但是,MATLAB 函数句柄不能传递到其起源实例之外的 MATLAB Runtime 实例中。例如,假设您有两个 MATLAB 函数,get_plot_handle
和 plot_xy
,并且 plot_xy
使用由 get_plot_handle
创建的函数句柄。
如果将它们编译成两个共享库,对 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);
}
}
}
}
使用对象
MATLAB Compiler SDK™ 使您能够将以下类型的对象从 MATLAB Runtime 返回到您的应用程序代码:
MATLAB
C++
.NET
Java
但是,您不能将在一个 MATLAB Runtime 实例中创建的对象传递到另一个 MATLAB Runtime 实例中。当返回对象的函数和操作该对象的函数被编译成不同的程序集时,就会发生这种冲突。
例如,您开发一个银行账户类和两个函数。第一个是根据一些条件为客户创建一个银行账户。第二种是在两个账户之间转移资金。
如果您将 open_acct.m
和 transfer.m
编译为单独的程序集,则无法使用通过 open_acct
创建的账户转移资金。transfer
调用引发异常。
解决这个问题的一种方法是将两个函数编译成一个程序集。您还可以重构应用程序,这样就不会将 MATLAB 对象传递给函数。