単一のアプリケーションでの複数のアセンブリに関する制限
複数の MATLAB® .NET アセンブリを使用するアプリケーションを開発するときは、以下についてはアセンブリ間で共有できないことに注意してください。
MATLAB 関数ハンドル
MATLAB Figure ハンドル
MATLAB オブジェクト
C、Java®、および .NET オブジェクト
cell 配列および構造体に格納された実行可能データ
MATLAB 関数ハンドルの操作
MATLAB 関数ハンドルは、アプリケーションと作成元の MATLAB Runtime インスタンスの間では渡すことができます。ただし、MATLAB 関数ハンドルを作成元以外の MATLAB Runtime インスタンスに渡すことはできません。たとえば、get_plot_handle
と plot_xy
の 2 つの MATLAB 関数があり、get_plot_handle
で作成された関数ハンドルを plot_xy
で使用したとします。
これらを 2 つの共有ライブラリにコンパイルした場合、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 インスタンスに渡すことはできません。この競合は、オブジェクトを返す関数とそのオブジェクトを操作する関数が別々のアセンブリにコンパイルされている場合に発生することがあります。
たとえば、銀行口座クラスと 2 つの関数を開発するとします。1 つ目の関数で、何らかの一連の条件に基づいて顧客の銀行口座を作成します。2 つ目の関数で、2 つの口座間で送金を行います。
open_acct.m
と transfer.m
を別々のアセンブリにコンパイルした場合、open_acct
で作成された口座を使用して送金することはできません。transfer
の呼び出しで例外がスローされます。
これを解決する 1 つの方法は、両方の関数を単一のアセンブリにコンパイルすることです。MATLAB オブジェクトを関数に渡さないようにアプリケーションをリファクタリングすることもできます。