创建 Windows Communications Foundation 组件
下面的示例展示如何使用类型安全接口实现 Windows® Communications Foundation (WCF) 组件并将其集成到客户端-服务器 .NET 应用程序中。
有关类型安全接口的其他示例和数据转换规则,请参阅实现类型安全接口并集成到 .NET 应用程序中。
有关 WCF 的最新信息,请参阅 Microsoft® 文档中的什么是 Windows Communication Foundation。
编写并测试您的 MATLAB 代码
创建 MATLAB® 程序,然后在实现类型安全接口之前测试代码。MATLAB 程序中的函数必须与本机 .NET 接口中的声明相匹配。
对于此示例,将以下代码保存为 addOne.m
。
function y = addOne(x) % Input must be either a scalar or a matrix of single or multiple dimensions if ~isnumeric(x) error('Input must be numeric. Input was %s.', class(x)); end y = x + 1; end
在 MATLAB 命令提示符下,输入 addOne([1,2,3])
。
输出为:
2 3 4
实现 WCF 接口
编写并测试 MATLAB 代码后,使用 C# 或 Visual Basic® 开发一个通过 API 支持本机类型的接口。
打开 Microsoft Visual Studio® 并创建一个名为
IAddOne
的新 Class Library (.NET Framework) 工程。在 Visual Studio 的解决方案资源管理器窗口中,将
Class1.cs
文件重命名为IAddOne.cs
。在此文件中,编写访问组件的 WCF 接口的源代码。在此示例中,
IAddOne
接口用 C# 编写,并指定了addOne
的六个重载:请注意,在
addOne
的 WCF 实现中,您使用OperationContract
属性来修饰该方法。您为每个方法赋予一个唯一的操作名称,该名称是通过Name
的OperationContract
属性指定的。注意
使用 WCF 时,重载函数必须具有唯一的名称。
接口中的每个方法必须与部署的 MATLAB 函数完全匹配。所有方法都有一个输入和一个输出(以匹配 MATLAB
addOne
函数),尽管这些参数的类型和位置各不相同。转到 Build > Configuration Manager 并将平台从 Any CPU 更改为 x64。
使用 Microsoft Visual Studio 构建工程。在构建文件夹中生成文件
IAddOne.dll
。注意
此示例假设您的程序集仅包含
IAddOne
。实际上,IAddOne
更有可能已经是已编译程序集的一部分。甚至在编写 MATLAB 函数之前,汇编可能就已经完成了。
使用 compiler.build.dotNETAssembly
创建 .NET 程序集
要使用 compiler.build.dotNETAssembly
函数在组件构建中生成类型安全的 API,请完成以下步骤:
使用
compiler.build.dotNETAssembly
构建 .NET 程序集。使用名称-值参量指定程序集名称和类名。compiler.build.dotNETAssembly('addOne.m', ... 'AssemblyName','AddOneComp', ... 'ClassName','Mechanism');
导航到生成的
AddOneCompdotNETAssembly
目录。使用 MATLAB 中的
ntswrap
命令生成类型安全的 API:ntswrap('-c','AddOneComp.Mechanism', ... '-a','IAddOne.dll', ... '-i','IAddOne');
并非所有参量都是互相兼容的。有关所有命令选项的详细信息,请参阅
ntswrap
。提示
如果
IAddOne.dll
程序集不在当前文件夹中,请指定完整路径。此命令生成程序集
MechanismIAddOne.dll
,其中包含命名空间Mechanism
中 MATLAB Compiler SDK™ 类AddOneCompNative
的类型安全 API。
使用 WCF 接口开发服务器程序
开发一个服务器程序,通过 WCFServiceContract
提供对 WCF addOne
接口定义的 IAddOne
重载的访问。该程序引用了 App.config
XML 配置文件。
WCF 服务器程序加载基于 WCF 的 addOne.Mechanism
组件,并通过类型安全的 mechanismIAddOne
接口使其可供 SOAP 客户端使用。
提示
当编写界面时,您将编写代码来处理锯齿状数组,而不是矩形数组。有关详细信息,请参阅锯齿状数组处理。
使用 Microsoft Visual Studio 编译服务器程序,步骤如下:
打开 Microsoft Visual Studio 并创建一个名为
AddOneApp
的 C# Console App (.NET Framework)。将以下源代码复制到工程中生成的
Program.cs
中:将以下配置文件
App.config
添加到您的工程。您可能需要修改列出的 .NET Framework 版本。在工程中添加对以下文件的引用:
此引用: 定义: IAddOne.dll
.NET 本机类型接口 IAddOne
MechanismIAddOne.dll
生成的类型安全 API AddOneCompNative.dll
生成的 .NET 程序集 注意
与其他 .NET 部署场景不同,您不需要在服务器程序源代码中引用
MWArray.dll
。MWArray
数据类型隐藏在MechanismIAddOne
中类型安全的 API 后面。添加对
System.ServiceModel
的引用,该引用在 Assemblies 下列出。转到 Build > Configuration Manager 并将平台从 Any CPU 更改为 x64。
使用 Microsoft Visual Studio 编译并运行服务器程序。
该程序显示以下输出:
Addition Server is up running...... Press any key to close the service.
按下某个键会产生以下结果。
Closing service....
为客户端生成代理代码
通过运行自动代理生成工具 svcutil.exe
配置您的客户端与服务器进行通信。大多数版本的 Microsoft Visual Studio 可以从服务器元数据自动生成客户端代理代码。
小心
在使用此步骤生成客户端代理代码之前,服务器必须可用且正在运行。否则,客户端将找不到服务器。
在 Microsoft Visual Studio 中创建客户端工程。
使用这两种方法之一添加引用。
方法 1 方法 2 在解决方案资源管理器窗格中,右键点击 References。
选择 Add Service Reference。出现添加服务引用对话框。
在 Address 字段中输入:
http://localhost:8001/Addition/
注意
请确保在
/
后面包含Addition
。在 Namespace 字段中,输入
AdditionProxy
。点击确定。
从客户端应用程序目录输入以下命令来生成
AdditionProxy.cs
,其中包含客户端代理代码。此命令还生成配置文件App.config
。svcutil.exe /t:code http://localhost:8001/Addition//out:AdditionProxy.cs /config:App.config
注意
在一行中输入上述命令,不要间断。
将
AdditionProxy.cs
和App.config
添加到您的客户端工程
注意
运行自托管应用程序时,您可能会遇到端口预留问题。根据需要,使用工具 netsh
修改端口配置。
使用 WCF 接口开发客户端程序
在启动时,客户端程序连接到 AdditionService
WCF 服务提供的 Addition
。WCF 客户端不直接调用类型安全机制 IAddOne
接口的方法,而是使用 OperationContract
的 IAddOne
属性中定义的方法名称。
通过执行以下操作,使用 Microsoft Visual Studio 编译客户端程序:
打开 Microsoft Visual Studio 并创建一个名为
AdditionClient
的 C# Console App (.NET Framework)。将以下源代码复制到工程中生成的
Program.cs
中:如果您尚未引用
System.ServiceModel
,请将其添加到您的 Visual Studio 工程中。转到 Build > Configuration Manager 并将平台从 Any CPU 更改为 x64。
使用 Microsoft Visual Studio 编译 WCF 客户端程序。
以管理员权限从命令行运行该程序。
该程序显示以下输出:
Conntecting to Addition Service through Http connection... Conntected to Addition Service... addOne(1) = 2 addOne(16) = 17 addOne(2) = 3 addOne(495) = 496 addOne([30 60 88]) = [31 61 89] addOne([0 2; 3 1]) = [1 3; 4 2] Press any key to close the client application.
按下一个键会导致以下结果:
Closing client....
提示
如果您想使用 WCF,最简单的方法是通过类型安全的 API。
WCF 和 .NET 远程处理在同一个部署工程或组件中不兼容。
此示例要求客户端和服务器都使用大于 WCF 默认值的消息大小。有关更改默认消息大小的信息,请参阅有关
maxreceivedmessagesize
属性的 MSDN 文章。
另请参阅
compiler.build.dotNETAssembly
| ntswrap
| .NET Remoting 和 Windows Communications Foundation | 类型安全接口