Ограничения на несколько блоков в отдельном приложении

При разработке приложений, которые используют несколько 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.

 get_plot_handle.m

 plot_xy.m

Если вы скомпилировали их в две разделяемых библиотеки, вызов 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. Этот конфликт может произойти, когда функция, которая возвращает объект и функцию, которая управляет тем объектом, скомпилирована в различные блоки.

Например, вы разрабатываете класс банковского счета и две функции. Первое создает банковский счет для клиента на основе некоторого набора условий. Вторые фонды передач между двумя учетными записями.

 account.m

 open_acct.m

 transfer.m

Если вы скомпилировали open_acct.m и transfer.m в отдельные блоки вы не могли передать фонды с помощью учетных записей, созданных с open_acct. Вызов transfer выдает исключение.

Один способ разрешить это состоит в том, чтобы скомпилировать обе функции в один блок. Вы могли также осуществить рефакторинг приложение, таким образом, что вы не передаете объекты MATLAB функциям.