主要内容

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

选择 .NET 部署选项

MATLAB® Compiler SDK™ 提供了以下两种在 .NET 应用程序中部署 MATLAB 函数的方法:

  • 使用 MATLAB Data API for .NET 部署到 .NET 应用程序 (自 R2022b 起)

  • 使用 MWArray API 部署到 .NET 应用程序

由于 MATLAB Compiler SDK 提供了两个 .NET 应用程序 API 来与已部署的 MATLAB 函数交互,因此两个部署选项根据用于在 .NET 应用程序和已部署的 MATLAB 函数之间交换数据的 API 进行区分。

选择 .NET 部署选项归根结底在于了解每个选项的功能,并认识到这些功能如何满足您的开发要求。这两个选项都提供了一套全面的 API,用于处理应用程序管理和数据操作。

MATLAB Data API for .NET 相对于 MWArray API 的优势

MathWorks® 建议使用更现代的 MATLAB Data API for .NET 而不是 MWArray API 来部署到 .NET 应用程序。与 MWArray API 相比,使用 .NET 的 MATLAB Data API 的优势在于:

  • 通过在 MATLAB 代码中使用包含类型信息的 arguments 代码块指定 C# 和 MATLAB 数据类型之间的映射,您可以使用原生 .NET 类型进行编程。这便无需在 C# 中管理 MATLAB 数据类型。

  • MATLAB Runtime 实例与 .NET 应用程序可以在同一进程内运行也可以跨不同进程运行,并且部署的 MATLAB 函数可以同步执行也可以异步执行。

  • 线程安全设计有助于跨多个线程并发创建和使用数据,而无需使用锁定机制。这会提高性能,特别是在多个线程中对 MATLAB 数据进行大量、密集的操作时。

  • MATLAB 类方法现已公开,支持对类对象直接调用这些方法。

  • 现在,基于 .NET 的 MATLAB Engine 应用程序与部署的 MATLAB 应用程序之间的转换便可轻松完成。

  • 支持跨平台开发和部署。自 R2023a 起,可以跨 Windows®、Linux®macOS 平台开发和发布包含打包的 MATLAB 代码的 .NET 应用程序。这意味着可以在这三种平台中的任一平台上进行开发,然后发布到另外两个平台上。

生成工件的差异

当您将 MATLAB 函数或类输入到 compiler.build.dotNETAssembly 功能或 .NET 程序集编译器时,两种部署选项生成的主要产品不同。

假设您有一个名为 calculateDistance 的 MATLAB 函数存储在名为 calculateDistance.m 文件中,并且您打算将其部署到 .NET 应用程序中,让我们检查一下两种部署方案的结果:

function distance = calculateDistance(p1, p2)
    % This function calculates the Euclidean distance between two points
    % Inputs:
    %   p1 - a two-element vector [x, y]
    %   p2 - a two-element vector [x, y]
    % Output:
    %   distance - the Euclidean distance between p1 and p2
    
    % Use arguments block to map C# type to corresponding MATLAB type
    % Int64 [] <--> (1,2) int64 {mustBeReal}
    
    arguments (Input)
        p1 (1,2) int64 {mustBeReal}
        p2 (1,2) int64 {mustBeReal}
    end

    arguments (Output)
        distance (1,1) int64 {mustBeReal}
    end
    
    % Calculate Euclidean distance
    diff = p1 - p2;
    diffSq = diff.^2;
    sumSq = sum(diffSq);
    distance = sqrt(sumSq);
end

当您将 calculateDistance.m 文件输入到 compiler.build.dotNETAssembly 函数时,MWArray API 是默认选择。要使用 MATLAB Data API,您需要使用名称-值对 Interface="matlab-data" 明确指定接口类型。

buildResults = compiler.build.dotNETAssembly( ...
    "calculateDistance.m",...
    Verbose="on", OutputDir=".\output_mwa", ...
    AssemblyName="CalculateDistance")
buildResults = compiler.build.dotNETAssembly( ...
    "calculateDistance.m", Interface="matlab-data",...
    Verbose="on", OutputDir=".\output_mda", ...
    AssemblyName="CalculateDistance")

该函数在指定文件夹中为两个 API 生成相应的文件:

P:\MATLAB\WORK\OUTPUT_MWA
    CalculateDistance.dll
    CalculateDistance.xml
    calculateDistanceClass.cs
    calculateDistanceClassNative.cs
    CalculateDistanceNative.dll
    CalculateDistanceNative.xml
    CalculateDistanceVersion.cs
    CalculateDistance_overview.html
    GettingStarted.html
    includedSupportPackages.txt
    mccExcludedFiles.log
    readme.txt
    requiredMCRProducts.txt
    unresolvedSymbols.txt

No subfolders exist
P:\MATLAB\WORK\OUTPUT_MDA
│   CalculateDistance.csproj
│   CalculateDistance.ctf
│   CalculateDistance.deps.json
│   CalculateDistance.dllGettingStarted.html
│   includedSupportPackages.txt
│   mccExcludedFiles.log
│   readme.txt
│   requiredMCRProducts.txt
│   unresolvedSymbols.txt
│
└───strongly_typed_interface
        calculateDistance.cs

MWArray API 案例中,生成了两组工件。第一组由一个 C# 包装器文件和一个相应的汇编文件组成,两者都使用 MWArray 类作为参量和返回值。此配置反映了内在的 MATLAB 数据结构。

同时,compiler.build.dotNETAssembly 生成第二组相应的工件,这些工件使用本机 .NET System.Object 类型作为方法参数和返回。此变体提供了 MATLAB 函数的更加以 .NET 为中心的视角,用标准 .NETMWArray 实例替换 Object

在 MATLAB Data API 案例中,compiler.build.dotNETAssembly 函数生成三个基本组件。首先,它创建一个代码存档(.ctf 文件),其中封装了要部署的 MATLAB 函数。其次,它制作相应的 C# 包装器文件,建立 MATLAB 和 C# 输入和输出数据类型之间的映射,并允许 MATLAB 函数被调用为 .NET 方法。最后,它生成一个可代替 C# 包装器文件的 .NET 程序集。

使用 MATLAB Data API 支持强类型

当您使用 MATLAB Data API 时,您可以选项指定 MATLAB 和 C# 数据类型之间的映射。

部署 MATLAB 函数时,需要一个 arguments 模块来指定输入和输出参量的类型信息。如果部署 MATLAB 类,请使用 properties 模块详细说明类属性的类型信息,并使用 arguments 模块为类方法的参量提供类型信息。

MATLAB 函数

例如,如果您的 C# 应用程序使用 Int64 数据类型来表示 MATLAB 函数的输入类型,则您可以使用 MATLABarguments 模块来指定相应的类型。生成的 MATLAB 代码、相关的 C# 包装器文件和 C# 应用程序代码如下:

% .m file
arguments (Input)
        p1 (1,2) int64 {mustBeReal}
        p2 (1,2) int64 {mustBeReal}
    end
arguments (Output)
        distance (1,2) int64 {mustBeReal}
    end
// .cs wrapper file
   
    public static void calculateDistance(
        MATLABProvider _matlab, 
        Int64 [] p1, Int64 [] p2,  
        out Int64 distance){
// .cs application file
  
Int64[] p1 = new Int64[2] { 0, 0 };
Int64[] p2 = new Int64[2] { 3, 4 };
...

Int64 distance;

MATLAB

如果您正在部署 MATLAB 类,请在 MATLAB 类中使用 properties 模块和 arguments 模块。

  • MATLAB 数据类型根据 argumentsproperties 模块中的类型规范映射到 C# 数据类型。

  • MATLAB 包映射到同名的 C# 子命名空间。根命名空间对应于程序集的名称。

  • MATLAB 类映射到同名的 C# 结构。C# 代码文件使用以下命名模式生成:<MatlabPackageName>_<MatlabClassName>.cs

  • MATLAB 类的公共方法映射到同名 C# 结构的公共方法。

  • MATLAB 类的属性映射到 C# 结构中同名的属性。

  • 限制

    在 R2023b 中: MATLAB 不支持 handle 类、函数 vararginvarargout

有关详细信息,请参阅将 MATLAB 类和函数映射到 C#

另请参阅

|

主题