主要内容

访问远程net程序集使用本机。net API:细胞和结构

为什么使用。net API与细胞数组和结构体?

使用MATLAB的。net表示®结构体和细胞阵列建议如果这些都是真的:

  • 你有MATLAB函数与MATLAB服务器结构或单元格数据类型作为输入或输出

  • 你不希望或需要安装MATLAB运行时在客户端机器上

本机MWArray,MWStructArray,MWCellArray类的成员MathWorks.MATLAB.NET.Arrays.native名称空间。

这个名称空间中的类名与类名相同MathWorks.MATLAB.NET.Arrays。所不同的是,本机结构和细胞数组没有方法或属性要求MATLAB运行时

matlabroot\工具箱\ dotnetbuilder \ \和例子版本\净文件夹的例子可以实践构建解决方案。金宝搏官方网站的NativeStructCellExample文件夹包含本机结构和细胞的例子。

建立你的组件

这个案例展示了如何部署一个远程组件使用本机结构和细胞阵列。之前设置远程客户机和服务器代码,构建一个远程组件使用的指令创建远程net程序集

本机。net细胞结构的例子

服务器应用程序主机远程组件。

客户端应用程序,运行在一个单独的过程,访问远程托管的服务器应用程序组件。构建的服务器微软®Visual Studio®项目文件NativeStructCellServer.csproj:

  1. 改变参考生成的组件组装component_name\ for_redistribution_files_only \component_nameNative.dll

  2. 选择适当的构建平台。

  3. 选择调试释放模式。

  4. 构建NativeStructCellServer项目。

  5. 提供的配置文件NativeStructCellServer。服务器的c#代码文件NativeStructCellServer.cs:

    使用系统;使用System.Collections.Generic;使用text;使用System.Runtime.Remoting;名称空间NativeStructCellServer{类NativeStructCellServer{静态void Main (string [] args) {RemotingConfiguration。配置(@“NativeStructCellServer.exe.config”);控制台。WriteLine (“NativeStructCell服务器开始…”);Console.ReadLine ();}}}
    这段代码读取相关的配置文件来确定:

    • 组件的主机的名称

    • 使用远程协议和消息格式

    • 租赁时间远程组件

    此外,代码还表明服务器是活动的,并等待一个回车之前终止。

编码和构建客户端应用程序和配置文件

客户端应用程序,运行在一个单独的过程,访问远程组件运行在服务器应用程序内置的本机。net细胞结构的例子。建立远程客户端使用微软Visual Studio项目文件NativeStructCellClient \ NativeStructCellClient.csproj。创建远程客户端使用微软Visual Studio:

  1. 改变参考生成的组件组装component_name\ for_redistribution_files_only \component_nameNative.dll

  2. 改变参考生成的界面组装component_name\ for_redistribution_files_only \我component_nameNative.dll

  3. 选择适当的构建平台。

  4. 选择调试释放模式。

  5. 构建NativeStructCellClient项目。

  6. 提供的配置文件NativeStructCellClient

NativeStructCellClient代码

客户的c#代码文件NativeStructCellClient \ NativeStructCellClient.cs:

NativeStructCellClient.cs

这段代码如下:

  • 客户端读取相关的配置文件的名称和位置远程组件。

  • 客户端使用静态实例化远程对象Activator.GetObject方法

  • 从这一点上,远程客户端调用远程组件上的方法一样调用本地组件方法。

NativeStructCellClient配置文件

的配置文件NativeStructCellClient在文件NativeStructCellClient \ NativeStructCellClient.exe.config:

< ?xml version = " 1.0 " encoding = " utf - 8 " ? > <配置> < appSettings > <添加关键= value =“NativeStructCellServer tcp: / / localhost: 1236 / NativeStructCellClass。远程" / > < / appSettings > < system.runtime.remoting > <应用> <频道> <通道名称=“NativeStructCellChannel”ref =“tcp端口= " 0 " > < clientProviders > <格式化程序ref = "二元" / > < / clientProviders > < serverProviders > <格式化程序ref =“二进制”typeFilterLevel = "完整" / > < / serverProviders > < /频道> < /频道> < /应用程序> < / system.runtime.remoting > < /配置>

这个代码指定:

  • 远程组件的名称服务器和远程组件URI(统一资源标识符)

  • 远程协议(TCP / IP)和端口号

  • 消息格式器(二进制)和通信通道的权限(完整的信任)

启动服务器应用程序

启动服务器,执行以下操作:

  1. 打开一个DOS或UNIX®命令窗口并导航到NativeStructCellServer \ bin \ x86 \ v4.0 \调试

  2. 运行NativeStructCellServer.exe。出现以下输出:

    事件1:初始化服务器,并将其发送给客户端结构:初始化空结构:名字:“地址:[]# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #活动3:部分初始化结构接收到服务器:名字:“地址:[1 x1 struct]地址字段初始化从客户机:街:3,苹果山驱动的城市:“纳蒂克”状态:“马”邮政编码:“01760 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #活动4:更新“名称”字段前发送回客户机结构:名字:“MathWorks的地址:[1 x1 struct] # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

从客户端应用程序

启动客户端通过做以下:

  1. 打开一个DOS或UNIX命令窗口并导航到NativeStructCellClient \ bin \ x86 \ v4.0 \调试

  2. 运行NativeStructCellClient.exe。后MATLAB运行时初始化时,出现以下输出:

    事件2:初始化结构在客户端应用程序:1 x1结构体数组字段:名称地址更新“地址”字段:1 x1结构体数组字段:街道城市国家邮政编码# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #事件5:最后的结构作为接收端:1 x1结构体数组字段:名称地址地址字段:1 x1结构体数组字段:街道城市国家邮政编码# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

编码和构建客户端应用程序和配置文件与本机MWArray MWStructArray, MWCellArray类

createEmptyStruct.m

初始化服务器上的结构并将其发送到客户端与MATLAB代码如下:

函数PartialStruct = createEmptyStruct (field_names)流(事件1:初始化服务器的结构发送客户:\ n”);PartialStruct =结构(field_names {1},' ',field_names {2}, []);流(“初始化空结构:\ n \ n”);disp (PartialStruct);流(' \ n # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \ n ');

updateField.m

从客户端接收部分更新结构和添加更多的数据,交给客户端之前,用下面的MATLAB代码:

函数FinalStruct = updateField (st, field_name)流(“\ nEVENT 3:部分初始化结构收到了通过服务器:\ n \ n”);disp (st);流(从客户的地址字段初始化:\ n \ n”);disp (st.Address);流(“# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \ n ');流([“\ nEVENT 4:更新“”field_name,“‘场前发送回客户机结构:\ n \ n ']);圣(field_name) =“MathWorks”;FinalStruct =圣;disp (FinalStruct);流(' \ n # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \ n ');

NativeStructCellClient.cs

创建客户端c#代码:

请注意

在这种情况下,您不需要MATLAB运行时系统上的路径。

使用系统;使用System.Collections.Generic;使用text;使用System.Runtime.Remoting;使用System.Configuration;使用MathWorks.MATLAB.NET.Arrays.native;使用INativeStructCellCompNative;/ /这是一个简单的示例,演示如何使用/ / MathWorks.MATLAB.NET.Arrays。本地包。名称空间NativeStructCellClient{类NativeStructCellClient{静态void Main (string [] args) {{RemotingConfiguration试试。配置(@“NativeStructCellClient.exe.config”);字符串urlServer = ConfigurationSettings。AppSettings (“NativeStructCellServer”); INativeStructCellClassNative nativeStructCell = (INativeStructCellClassNative)Activator.GetObject(typeof (INativeStructCellClassNative), urlServer); MWCellArray field_names = new MWCellArray(1, 2); field_names[1, 1] = "Name"; field_names[1, 2] = "Address"; Object[] o = nativeStructCell.createEmptyStruct(1,field_names); MWStructArray S1 = (MWStructArray)o[0]; Console.WriteLine("\nEVENT 2: Initialized structure as received in client applications:\n\n{0}" , S1); //Convert "Name" value from char[,] to a string since // there's no MWCharArray constructor // on server that accepts char[,] as input. char c = ((char[,])S1["Name"])[0, 0]; S1["Name"] = c.ToString(); MWStructArray address = want new MWStructArray(new int[] { 1, 1 }, new String[] { "Street", "City", "State", "Zip" }); address["Street", 1] = "3, Apple Hill Drive"; address["City", 1] = "Natick"; address["State", 1] = "MA"; address["Zip", 1] = "01760"; Console.WriteLine("\nUpdating the 'Address' field to :\n\n{0}", address); Console.WriteLine("\n#################################\n"); S1["Address",1] = address; Object[] o1 = nativeStructCell.updateField(1, S1, "Name"); MWStructArray S2 = (MWStructArray)o1[0]; Console.WriteLine("\nEVENT 5: Final structure as received by client:\n\n{0}" , S2); Console.WriteLine("\nAddress field: \n\n{0}" , S2["Address",1]); Console.WriteLine("\n#################################\n"); } catch (Exception exception) { Console.WriteLine(exception.Message); } Console.ReadLine(); } } }

NativeStructCellServer.cs

创建服务器c#代码:

使用系统;使用System.Collections.Generic;使用text;使用System.Runtime.Remoting;名称空间NativeStructCellServer{类NativeStructCellServer{静态void Main (string [] args) {RemotingConfiguration。配置(@“NativeStructCellServer.exe.config”);控制台。WriteLine (“NativeStructCell服务器开始…”);Console.ReadLine ();}}}