主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

单个应用程序中多个程序集的限制

在开发使用多个 MATLAB® .NET 程序集的应用程序时,请考虑以下内容不能在程序集之间共享:

  • MATLAB 函数句柄

  • MATLAB 图窗句柄

  • MATLAB 对象

  • C、Java® 和 .NET 对象

  • 存储在元胞数组和结构中的可执行数据

使用 MATLAB 函数句柄

MATLAB 函数句柄可以在应用程序和它起源的 MATLAB Runtime 实例之间传递。但是,MATLAB 函数句柄不能传递到其起源实例之外的 MATLAB Runtime 实例中。例如,假设您有两个 MATLAB 函数,get_plot_handleplot_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.mtransfer.m 编译为单独的程序集,则无法使用通过 open_acct 创建的账户转移资金。transfer 调用引发异常。

解决这个问题的一种方法是将两个函数编译成一个程序集。您还可以重构应用程序,这样就不会将 MATLAB 对象传递给函数。