メインコンテンツ

単一のアプリケーションでの複数のアセンブリに関する制限

R2026b

複数の 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 で使用したとします。

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
function plot_xy(x, y, h)
h(x, y);
end

これらを 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 つの口座間で送金を行います。

% 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 の呼び出しで例外がスローされます。

これを解決する 1 つの方法は、両方の関数を単一のアセンブリにコンパイルすることです。MATLAB オブジェクトを関数に渡さないようにアプリケーションをリファクタリングすることもできます。