选择 .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.dll │ GettingStarted.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 数据类型根据
arguments
和properties
模块中的类型规范映射到 C# 数据类型。MATLAB 包映射到同名的 C# 子命名空间。根命名空间对应于程序集的名称。
MATLAB 类映射到同名的 C# 结构。C# 代码文件使用以下命名模式生成:
。<MatlabPackageName>
_<MatlabClassName>
.csMATLAB 类的公共方法映射到同名 C# 结构的公共方法。
MATLAB 类的属性映射到 C# 结构中同名的属性。
限制
在 R2023b 中: MATLAB 不支持
handle
类、函数varargin
和varargout
。
有关详细信息,请参阅将 MATLAB 类和函数映射到 C#。